【问题标题】:Are Python args and kwargs ever named something else in practice?Python args 和 kwargs 在实践中是否曾经命名过其他东西?
【发布时间】:2018-12-07 20:12:24
【问题描述】:

Python 不限制参数的名称,但是某些参数名称严格遵守约定,例如selfclsargskwargsselfcls 这两个名字总是代表同一个概念,所以在这些情况下,我很难找到一个令人信服的理由让某人改变惯例。但是,对于 argskwargs,我发现这种命名约定令人窒息。

假设我有一个具有各种属性的类,可以通过将 kwargs 传递给它的构造函数来设置:

class MyObj:
    def __init__(self, **kwargs):
        for propname in kwargs:
            self.set_property(propname, kwargs[propname])

在这种情况下,kwargs 只是该类实例的可设置属性,所以对我来说,将定义编写如下:

class MyObj:
    def __init__(self, **properties):
        for propname in properties:
            self.set_property(propname, properties[propname])

这样,只需查看方法的签名即可了解 kwarg 的用途。

一般来说,我相信约定是一件好事。但是,在我看来,总是使用argskwargs 是错失向API 用户传达有关函数/方法的args 和kwargs 性质的有用信息的机会。毕竟,单星号或双星号的存在已经清楚地表明了它们是未命名或命名参数的事实。

有没有人在现实世界的多开发人员代码中使用 args 和 kwargs 的替代名称的示例,或者为这些结构使用其他变量名称是否太不合时宜?

如果不使用这些传统名称真的只是一个可怕的想法,那是什么原因?

【问题讨论】:

    标签: python naming-conventions keyword-argument


    【解决方案1】:

    我认为没有任何理由反对使用特定于上下文的名称,例如 ...

    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'
    

    collections.ChainMap 在文档和__init__ 中使用*maps

    >>> from collections import ChainMap
    >>> from inspect import signature
    >>> signature(ChainMap.__init__)
    <Signature (self, *maps)>
    

    请随意寻找更多示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2017-01-28
      • 2023-03-19
      • 2018-10-28
      • 2011-01-27
      • 2014-05-24
      • 2011-04-13
      相关资源
      最近更新 更多