为什么不总是使用关键字参数?

2024-05-21 18:59:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在开始使用python之前,我已经开始使用一些Objective-C/Cocoa书籍。我记得,大多数函数都要求显式声明关键字参数。直到最近我才忘记这一切,只在Python中使用了位置参数。但最近,我遇到了一些错误,这是由于不正确的位置-他们偷偷摸摸的小事。

让我想-一般来说,除非有一个情况特别需要非关键字参数-有没有什么好的理由不使用关键字参数?即使对于简单的函数,总是使用它们被认为是不好的风格吗?

我觉得,由于我的50行程序中的大多数已经定期扩展到500行或更多行,如果我习惯于始终使用关键字参数,那么随着代码的增长,它将更易于阅读和维护。有什么理由不这样吗?

更新:

我得到的一般印象是,这是一种风格偏好,有很多好的论点,它们一般不应该用于非常简单的论点,但在其他方面与好的风格是一致的。在接受之前,我只想澄清一下——这个方法是否会产生任何特定的非风格问题——例如,显著的性能影响?


Tags: 函数代码程序声明参数风格错误情况
3条回答

除了代码的清晰性和可读性之外,没有任何理由不使用关键字参数。是否使用关键字的选择应基于关键字在读取代码时是否添加了其他有用信息。

我遵循以下一般规则:

  1. 如果很难从函数名推断参数的函数(名称),请按关键字传递(例如,我不希望在代码中有text.splitlines(True))。
  2. 如果很难推断参数的顺序,例如参数太多,或者有独立的可选参数,请按关键字传递(例如,funkyplot(x, y, None, None, None, None, None, None, 'red')看起来不太好)。
  3. 如果参数的目的显而易见,就不要按关键字传递前几个参数。你看,sin(2*pi)sin(value=2*pi)好,同样的道理也适用于plot(x, y, z)

在大多数情况下,稳定的强制参数将是位置参数,而可选参数将是关键字。

在性能上也有可能存在差异,因为在每个实现中,关键字参数都会稍微慢一点,但是考虑到这通常是一个过早的优化,并且从中得到的结果不会很显著,我认为这对决策并不重要。

更新:非文体问题

关键字参数可以做任何位置参数可以做的事情,如果您定义一个新的API,除了可能的性能问题之外,没有任何技术上的缺点。但是,如果将代码与现有元素组合,则可能会有一些小问题。

请考虑以下几点:

  • 如果使函数接受关键字参数,则它将成为接口的一部分。 不能将函数替换为具有相同签名但具有相同参数的不同关键字的函数。
  • 您可能希望在函数上使用decorator或其他假定函数接受位置参数的实用程序。Unbound方法就是这种实用程序的一个例子,因为它们总是在将第一个参数读取为positional后将其作为positional传递,因此即使定义中有一个参数self也无法工作。

如果你设计好你的API并记录关键字参数的使用,尤其是如果你没有设计一个应该与已经存在的东西互换的东西,这些都不是真正的问题。

如果您考虑的是提高函数调用的可读性,为什么不简单地声明函数为normal,例如

def test(x, y):
    print "x:", x
    print "y:", y

只需通过显式声明名称来调用函数,如下所示:

test(y=4, x=1)

这显然给了你输出:

x: 1
y: 4

否则这个练习将毫无意义。

这避免了参数是可选的并且需要默认值(除非您希望它们是可选的,在这种情况下,只需继续使用关键字参数!:)并为您提供不受顺序限制的命名参数的所有通用性和改进的可读性。

好吧,我不这么做有几个原因。

如果所有参数都是关键字参数,则会增加代码中的噪声,并且可能会消除哪些参数是必需的,哪些参数是可选的。

另外,如果我必须使用你的代码,我可能想杀了你!!(开玩笑),但每次都要输入所有参数的名称。。。没那么好玩。

相关问题 更多 >