小编典典

有什么理由不总是使用关键字参数吗?

python

在开始学习python之前,我已经开始学习一些Objective-C /
Cocoa书籍。我记得,大多数函数都需要明确说明关键字参数。直到最近,我都忘记了这一切,只是在Python中使用了位置参数。但是最近,我遇到了一些由于位置不当而导致的错误-
它们是偷偷摸摸的小东西。

让我思考-一般而言,除非有专门要求使用非关键字参数的情况-是否有充分的理由不使用关键字参数?即使对于简单功能也总是使用它们是否被认为是不好的风格?

我感觉就像我的大多数50行程序都定期扩展到500行或更多行一样,如果我习惯于始终使用关键字参数,随着代码的增长,代码将更易于阅读和维护。有什么原因可能不是这样吗?

更新:

我得到的总体印象是,它具有样式首选项,其中包含许多好的参数,通常不应将它们用于非常简单的参数,而应与好的样式保持一致。在接受之前,我只是想澄清-
这种方法是否会引起任何特定的非样式问题-例如,性能显着下降?


阅读 166

收藏
2021-01-20

共1个答案

小编典典

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

我遵循以下一般规则:

  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,除了可能的性能问题之外,没有技术上的缺点。但是,如果将代码与现有元素结合在一起,则可能会遇到一些问题。

考虑以下:

  • 如果使函数采用关键字参数,则它将成为接口的一部分。您不能用签名相似但关键字相同的参数来替换函数。
  • 您可能要在函数上使用装饰器或其他实用程序,假定您的函数采用位置参数。未绑定方法是此类实用程序的一个示例,因为它们在将第一个参数读为位置后始终将第一个参数作为位置传递,因此cls.method(self=cls_instance)即使self定义中有一个参数也不起作用。

如果您精心设计了API并记录了关键字参数的使用,那么所有这些都不是一个真正的问题,尤其是如果您不打算设计与现有的东西可以互换的东西时,尤其如此。

2021-01-20