Python中的参数命名惯例

3

对于具有密切相关的形参的函数,例如

def add_two_numbers(n1, n2):
    return n1 + n2

def multiply_two_numbers(n1, n2):
    return n1 * n2

在两个函数中给参数取相同的名称是否是一个好主意呢?

另一种选择是在其中一个函数中重命名参数。例如:

def add_two_numbers(num1, num2):
    return num1 + num2

在两个函数中保持参数相同看起来更一致,因为它们各自接受的参数是类似的,但这样做是否更加令人困惑?

同样,在下面的示例中哪种方式更好呢?

def count(steps1, steps2):
    a = 0
    b = 0

    for i in range(steps1):
        a += 1

    for j in range(steps2):
        b += 1

    return a, b

def do_a_count(steps1, steps2):
    print "Counting first and second steps..."
    print count(steps1, steps2)

否则,更改第二个函数中的参数会得到:
def do_a_count(s1, s2):
    print "Counting first and second steps..."
    print count(s1, s2)

我有点不确定哪一种方法最好。保持相同的参数名称使得两个函数之间的关系更加清晰,而第二种方法则意味着在两个函数之间没有混淆参数的可能性。

我进行了一些搜索(包括浏览PEP-8),但没有找到明确的答案。 (我在SO上找到的类似问题包括:Python函数中可选参数的命名惯例在Python中,避免在__init__参数和实例变量中使用相同名称的最佳方法是什么?


而第二种意味着在这两个函数的参数中不可能混淆。您能举个您担心的混淆类型的例子吗? - Karl Knechtel
在这些情况下,很少有混淆的可能性(也许通常是这样...)我想我更多地考虑使用相同的名称作为变量的参数,这或许不是一个好主意。 - Steven Maude
3个回答

8

除非你有充分的理由使用不同的名称,否则我建议保持名称不变...请记住,即使是位置参数也可以通过关键字进行调用,例如:

>>> def foo(a,b):
...     print a
...     print b
... 
>>> foo(b=2,a=1)

保持“关键词”不变有助于处理那些罕见但合法的情况...

2

通常情况下,你应该为函数的参数取一个有意义的名字,并且在选择这些名称时不考虑其他函数的任何内容。即使这些函数执行类似的操作,它们的参数名称也没有任何关系。

不过...如果这些函数确实执行类似的操作,那么这可能是你错过了重构的迹象? :)


2
重要的指导原则是给它们合理的名称,最好是你在一年后回到代码时会猜测参数具有的第一个名称。
每个程序员都有一套约定。有些人喜欢将二进制函数的整数参数称为n1和n2;其他人喜欢n、m;或lhs,rhs;或其他一些东西。只要你选择并坚持使用一个名称(只要它是合理的),任何其他人都可以在学习你的风格几秒钟后阅读并理解你的代码。如果你在各个地方使用不同的名称,他们就必须进行更多的猜测。
正如mgilson所指出的那样,这允许您使用关键字参数。这也意味着带有自动完成功能的IDE更加有用——当您看到(…n1…,…n2…)弹出时,您知道您想传递两个整数。但主要是为了可读性。
当然,如果有不同的含义,请给它们不同的名称。在某些情况下,具有augend、addend的add_two_numbers和factor、multiplicand的multiply_two_numbers可能是合理的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接