Ian*_*ent 4 python naming-conventions keyword-argument
Python不限制的参数名称,但有些参数名称强烈约定管辖,比如self,cls,args,和kwargs。名称self和cls始终代表相同的概念,因此在这些情况下,我很难找到令人信服的理由让某人偏离惯例。但是,对于args和kwargs,我发现这种命名约定令人窒息。
假设我有一个具有各种属性的类,可以通过将 kwargs 传递给其构造函数来设置这些属性:
class MyObj:
def __init__(self, **kwargs):
for propname in kwargs:
self.set_property(propname, kwargs[propname])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,kwargs 仅打算作为该类实例的可设置属性,因此对我而言,将定义编写如下是有意义的:
class MyObj:
def __init__(self, **properties):
for propname in properties:
self.set_property(propname, properties[propname])
Run Code Online (Sandbox Code Playgroud)
这样,人们只需要查看方法的签名即可了解 kwargs 的用途。
一般来说,我认为约定俗成是一件好事。但是,在我看来,总是使用args并且kwargs是一个错失的机会,可以向 API 用户传达有关函数/方法的 args 和 kwargs 性质的有用信息。毕竟,它们是未命名或命名参数的事实已经通过单星号或双星号的存在清楚地表明。
有没有人有在现实世界的多开发人员代码中使用 args 和 kwargs 的替代名称的示例,或者对这些构造使用其他变量名称是否太违背了原则?
如果不使用这些传统名称真的只是一个可怕的、可怕的想法,那是什么原因呢?
我看不出有任何理由反对使用特定于上下文的名称,例如 ...
my_sum(*numbers),my_parser(*strings, **flags)等等。
该print文件说*objects。
该zip文件说*iterables。
itertools.chain使用*iterables的文档,然后在文档字符串。
>>> from itertools import chain
>>> chain.__doc__.splitlines()[0]
'chain(*iterables) --> chain object'
Run Code Online (Sandbox Code Playgroud)
collections.ChainMap使用*maps的文档和__init__。
>>> from collections import ChainMap
>>> from inspect import signature
>>> signature(ChainMap.__init__)
<Signature (self, *maps)>
Run Code Online (Sandbox Code Playgroud)
随意寻找更多示例。