Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中函数参数顺序的最佳实践_Python - Fatal编程技术网

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

Python中函数参数顺序的最佳实践,python,Python,我经常编写函数,其中一个参数包含要操作的数据,一个或多个附加参数包含操作的规范。如果“specification”参数是可选的,那么将它们放在强制性的数据参数之后是有意义的: sort(data, key=..., reverse=True) 但假设两个论点(或其中几个论点)都是强制性的?re模块的函数将regexp(操作)放在字符串(要操作的数据)之前。当然,可选参数仍然排在最后 re.search(r"[regexp]+", text, flags=re.I) 所以问题是:抛开可选参数

我经常编写函数,其中一个参数包含要操作的数据,一个或多个附加参数包含操作的规范。如果“specification”参数是可选的,那么将它们放在强制性的
数据
参数之后是有意义的:

sort(data, key=..., reverse=True) 
但假设两个论点(或其中几个论点)都是强制性的?
re
模块的函数将regexp(操作)放在字符串(要操作的数据)之前。当然,可选参数仍然排在最后

re.search(r"[regexp]+", text, flags=re.I)
所以问题是:抛开可选参数不谈,对于如何根据功能/目的对强制性参数进行排序,是否有明确的约定(官方政治公众人物或既定惯例)?当我第一次学习Python的时候,我记得读过一些声明,大意是Python的优势之一是它有明确的约定,特别是在这个特定的事情上。但我现在无法检索任何此类信息


如果不清楚的话:我是在善意地询问有关既定惯例或标准的指针,而不是关于哪个顺序是“最佳”的建议。

这是一个非常好的问题,我已经很高兴看到其他答案了。在Python中,我从未遇到过关于函数参数的任何约定,但在PEP 8中,它指出:

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

始终将cls用作类方法的第一个参数

如果函数参数的名称与保留关键字冲突,则为 通常最好附加一个尾随下划线,而不是 使用缩写或拼写错误。因此,class_uu比 clss。(最好使用同义词来避免此类冲突。)

在我看来,函数参数应该始终按重要性排序。我知道重要性是主观的,但您通常可以确定哪些参数对您的函数最重要。因为StackOverflow与意见无关,所以对此持保留态度


所以抛开观点不谈,我认为你的问题是相关的,但有时问题会导致其他讨论。如果你有很多参数,你的函数可能做了太多的事情。根据许多资源,您应该尽量只使用一个参数,避免使用三个以上的参数,因为后者被认为是最坏的情况。因此,如果您记住这一点,大多数情况下对参数排序不会对可读性产生太大影响

我尝试对参数进行排序以帮助代码可读性(识字编程)。 例:

这通常与@scharette的观点一致,“最重要”的参数是为其创建函数的对象。但正如(他)所说,这是主观的,可以说数据库是数据库系统库中最重要的对象


阅读代码应在第一次阅读时显示意图;阅读一组函数定义应该可以揭示它们的作用。

我很确定PEP 8没有解决这个问题。我想,这类似于
map(f,data)
filter
工作的方式。。。对我来说,最重要的是保持你的APIA的一致性。在我写这个问题之前,我检查了一下:-)同意@juanpa.arrivillaga建立你自己的惯例,并与之保持一致。我想在你看来,这两个顺序同样好?我已经有了一个惯例,但我想知道智者和社区智慧得出了什么结论。我发现这篇文章()有一些稍微相关的信息,但我认为在绝大多数情况下,上述评论是正确的,因为一致性是争论顺序的主要问题。我找不到针对该问题的标准。除了可选参数外,本文主要讨论了更多的附带情况。我觉得有趣的是,规则2中的参数应该被称为
cls
,而不是
class
,违反了规则3。
  system.add(user, user_database) # add a user to a database
  system.add(user_database, user) # add a database to a user(?)