Python中函数参数顺序的最佳实践

5

我经常编写仅接收一个参数用于数据操作的函数,以及一个或多个其他参数来指定操作。如果这些“规范”参数是可选的,将它们放在必须的 data 参数之后是有意义的:

sort(data, key=..., reverse=True) 

但是如果两个(或多个)参数都是必须的呢?re模块的函数将正则表达式(操作)放在字符串(要操作的数据)之前。当然,可选参数仍然是最后一个。

re.search(r"[regexp]+", text, flags=re.I)

所以问题是:抛开可选参数,有没有明确的约定(官方PEP或已经建立的常规做法)来根据功能/目的对必需参数进行排序?当我第一次学习Python时,我记得读到过一些关于Python优点的说法之一是它有明确的惯例,包括在这个特定的事情上。但是现在我无法检索到任何此类信息。
如果不清楚:我很客气地要求指向已建立的惯例或标准的指针,而不是要求哪种顺序是“最佳”的建议。

我很确定PEP 8没有涉及到这个问题。我想,这与map(f, data)filter的工作方式类似... 对我来说,最重要的是在API中保持一致性。 - juanpa.arrivillaga
这并不是如此,我在写这个问题之前已经检查过了 :-) - alexis
1
同意 @juanpa.arrivillaga 的观点,建立自己的规范,并保持一致。 - Mohammad Athar
那么在你的看法中,这两个命令是同样好的吗?我已经有一个约定,但我想知道更明智的头脑和社区智慧得出了什么结论。 - alexis
发现了这篇文章(http://www.informit.com/articles/article.aspx?p=2314818),其中包含一些略微相关的信息,但我认为在绝大多数情况下,上述评论是正确的,即一致性是参数顺序的主要问题。我找不到针对此问题的具体标准。该文章主要涵盖了除可选参数外的更边缘的情况。 - ividito
谢谢,我也看到了。但是它没有说明需要对参数进行排序,对吗? - alexis
2个回答

0

这是一个非常好的问题,我已经很兴奋地想看到其他答案了。我在 Python 中从未遇到过任何有关函数参数的约定,除了在 PEP 8 中提到:

实例方法的第一个参数始终使用 self。

类方法的第一个参数始终使用 cls。

如果函数参数名称与保留关键字冲突,则通常最好添加一个单下划线而不是使用缩写或拼写错误。因此,class_ 比 clss 更好。(也许更好的方法是通过使用同义词来避免此类冲突。)

在我的观点中,函数参数应该总是按照重要性的顺序排列。我知道“重要性”是主观的,但你通常可以确定哪个参数对于你的函数最为重要。由于 StackOverflow 不涉及个人观点,所以这只是供参考。

因此,撇开观点,我认为您的问题是相关的,但有时问题会导致其他讨论。如果您有很多参数,那么您的函数可能做了太多的事情。根据许多资源的说法,您应该尝试仅使用一个参数,并避免使用超过三个参数,后者被认为是最糟糕的情况。因此,大多数情况下,如果您记住这一点,参数排序不会对可读性产生太大影响。


1
我觉得有趣的是,规则2中的参数应该被称为cls而不是class_,这违反了规则3。 - kaya3

0

我尝试对参数进行排序,以帮助代码的可读性(文学编程)。 例如:

  system.add(user, user_database) # add a user to a database
  system.add(user_database, user) # add a database to a user(?)

这通常与@scharette的意见相一致,“最重要”的参数是创建函数的对象。但正如他所说,这是主观的,可以争论数据库是数据库系统库中最重要的对象。

阅读代码应该在第一次阅读时透露出意图;阅读一组函数定义应该透露出它们的功能。


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