Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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中*args的正确使用与过度使用_Python_Arguments_Maintainability - Fatal编程技术网

Python中*args的正确使用与过度使用

Python中*args的正确使用与过度使用,python,arguments,maintainability,Python,Arguments,Maintainability,我一直在看我正在使用的开源软件包的源代码。几乎每个函数都使用*参数而不是命名参数。我发现很难理解和使用这些代码,因为每次我想调用一个函数时,我都必须返回,挑选源代码,确定参数应该是什么,以及它们应该是什么顺序。我的问题是:在每个函数中使用*args是否都有令人信服的理由,或者这是对这个概念的滥用? 谢谢 -b在每个函数中使用*args是一个坏主意,因为它会掩盖代码中的错误(使用错误数量的参数调用函数)。我认为经验法则应该是,如果你需要*args,*args,当没有令人信服的理由使用*args时,

我一直在看我正在使用的开源软件包的源代码。几乎每个函数都使用*参数而不是命名参数。我发现很难理解和使用这些代码,因为每次我想调用一个函数时,我都必须返回,挑选源代码,确定参数应该是什么,以及它们应该是什么顺序。我的问题是:在每个函数中使用*args是否都有令人信服的理由,或者这是对这个概念的滥用? 谢谢
-b

在每个函数中使用
*args
是一个坏主意,因为它会掩盖代码中的错误(使用错误数量的参数调用函数)。我认为经验法则应该是,如果你需要
*args
*args
,当没有令人信服的理由使用
*args
时,这是对这个概念的滥用。通常,论点有好名字,这有助于理解。即使没有,
(x,y,z)
告诉您的不仅仅是
(*args)

除了使代码更具可读性之外,它还有助于捕获错误(例如,如果您使用
(2,3)
调用
(x,y,z)
函数,您将在调用时得到错误,而不是深入函数内部),它通常更简洁,甚至可以更高效

但是,
*args
的广泛使用有时有令人信服的原因

例如,如果您正在包装一个较低级别(C或其他)的模块,并且希望实现完美的转发,那么使用
*args
就更容易了。如果您是自动生成包装器代码而不是手动编写,则更是如此。当然,这仍然是一种折衷——对于包装器模块的开发人员来说要容易得多,但是对于用户来说要困难得多,但有时这种折衷是值得的


在不知道您所指的特定包的情况下,不可能猜测它是一个引人注目的用例还是一个滥用。

这可能是个人原因,但我只在有很多可选字段时使用*args和**kwargs,其中一些字段仅在特定上下文中使用

我使用args的唯一其他场合是为云API构建XML RPC客户端。由于我只是将参数传递给底层,而且函数是动态生成的,所以我没有其他选择,只能使用*args,因为我无法预先知道所有参数

在大多数情况下,你甚至不需要它。我认为这主要是懒惰。 一些来自Java和C#的人可能会用它来代替“params”,但在python中传递可选参数的方法太多了


我同意,即使您使用*args,您也应该有一个非常好的文档。

在中,我们被告知更喜欢显式而不是隐式。尽可能使用显式参数。

如果要包装未知函数(装饰程序返回的函数通常会这样做),则通常需要使用
(*args,**kwargs)

有些类层次结构在方法中使用
(*args,**kwargs)
,这些方法在层次结构中的不同类上可能需要不同的签名(
\uuuuuu init\uuuu
是罪魁祸首)。如果您可以避免这种情况,那么它确实很有帮助,但是以合理的方式处理多继承层次结构是必要的(或者至少在处理多继承时尽可能合理)

当我有大量可选参数时,有时会使用
**kwargs
,但这需要大量文档


在使用
*args
本身的函数中(而不是像在decorator或类继承案例中那样,将它们传递给具有未知签名的其他函数),那么我倾向于认为
*args
几乎不应该被使用,除非它表示“零或更多相同类型的东西”。在这种情况下,您应该将其命名为
*网站
*宇宙飞船
*西瓜
,而不是
*args
。一堆不相关的参数不应该被压缩成
*args
。更糟糕的是,函数使用
*args
获取“x、y和z,或者x和z”,其中第二个参数根据传递的参数数量执行不同的操作。在这一点上,它们应该清楚地都有名称和默认值(即使只是标准的
None
default,然后在函数中查看哪些是非
None
模式),并通过关键字而不是位置传递。

如果有*args,则需要一个(准确的!)docstring。它是什么包?“不要玩责备的游戏,但他们可能有一个合理的理由。”尼诺引用禅宗的话,没有进一步的评论,这是毫无用处的。Python禅宗中的指导方针很好,但不仅仅因为它们是Python禅宗中的指导方针,它们是有充分理由的好主意。在不理解这些指导原则的原因的情况下记忆Python的禅宗(这样你就可以在背离这些指导原则时识别出来)并不能帮助你很好地应用它们。@Ben,我不认为我应该去推测为什么禅宗中有那个特定的项目。在这种情况下,我认为这是非常明显的-显式更容易理解和遵循。我还发现,使用指导平台设计者的相同原则只会使总体情况更好,而不仅仅是在Python中。在Python的一个月里,我看到
(*args,**kwargs)
太多次了,以至于我的眼睛都流血了。我建议谨慎使用它;这是一个工具,应该用来解决一个非常具体的问题。正如我们所知,当你给人们一个这么容易使用的工具时,他们会过度使用并滥用到无穷无尽。