【问题标题】:When are python sunder names used?什么时候使用 python sunder 名称?
【发布时间】:2019-01-31 01:00:31
【问题描述】:

在 Python 中,有单前导下划线、双前导下划线、双前导 + 双尾下划线和单尾下划线的约定。其中许多都在 What is the meaning of a single- and a double-underscore before an object name? 的答案中进行了概述。

但是单前导+单尾下划线的含义或约定是什么?我第一次看到他们在enum module

8.13.15.3.2。支持_sunder_ 名称

  • _name_ – 成员姓名
  • _value_ – 成员的值;可以在new中设置/修改
  • _missing_ – 找不到值时使用的查找函数;可能会被覆盖
  • _ignore_ – 名称列表,可以是 list() 或 str(),不会转换为成员,并将从最终类中删除
  • _order_ – 在 Python 2/3 代码中使用以确保成员顺序一致(类属性,在类创建期间删除)
  • _generate_next_value_ – 由功能 API 和自动使用来为枚举成员获取适当的值;可能会被覆盖

我以前从未见过这样的单前导单尾下划线 sunder 名称。它们是否以任何特殊方式处理,或者以其他方式具有与任何其他与下划线相关的命名约定不同的隐含含义?它们与根本没有下划线有何不同?

【问题讨论】:

    标签: python enums naming-conventions underscores


    【解决方案1】:

    他们没有受到任何特殊对待。它们被 enum 模块用来

    • 不会被意外覆盖

    例如

    class Status(Enum):
        alive = auto()
        dead = auto()
        missing = auto()
    

    您可以看到Status.missingStatus._missing_ 是不同的对象。如果 Enum 方法 _missing_ 被命名为 missing,我们会覆盖它。

    • 不显示为私有。 python 中的名称_value 被认为是私有的。为了表示这些不是私有的(同样,用户可能希望枚举值是私有的),而是给它们命名

    • 其他替代品,如__double_leading_underscore__dunder__ 在python 中也有特殊含义,如上所述。 Enum 中的 _sunder_ 方法类似于纯 python 的 __dunder__ 协议,但不被语言保留。

    基本上,这是一种避免属性名称冲突而又不给人错误印象的选项。

    【讨论】:

    • 但是_name__value_Enum 类型的属性,而不是元类EnumMetaclass Test(Enum): a = 0,然后是 Test.a._name_ == 'a'Test._name_,但会产生 AttributeError。我可以看到需要如何防止 EnumMeta 上的属性名称冲突,但是生成的 Enum 类型的冲突风险在哪里?
    • 此外,Test.a.nameTest.a.value 工作,所以看起来 _name__value_ 只是 namevalue 的同义词,分别.
    • 作为Enum的作者,我同意这个答案。 ;-)
    • 值得指出的是,流行的 Jupyter REPL 和可视化框架(包括强大支持下的 IPython)在某种程度上广泛使用了“sunder”命名的属性和方法,例如_repr_jpeg__repr_html_,以便在其增强的 REPL 环境中为兼容的 Python 对象提供定制渲染(q.v. 相同的细节,ipython.readthedocs.io/en/stable/config/integrating.html supra。)
    • @gerrit:你的问题的答案比我想在评论中涉及的更多。如果您将其作为一个新问题提出,我很乐意回答。
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2018-05-05
    相关资源
    最近更新 更多