何时使用python破损名称?

时间:2018-08-24 14:08:52

标签: python enums naming-conventions underscores

在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_ –成员的价值;可以在新建
  • 中设置/修改   
  • _missing_ –未找到值时使用的查找函数;可能会被覆盖
  •   
  • _ignore_ –名称列表,无论是list()还是str(),都不会转换成成员,并且会从最终类中删除
  •   
  • _order_ –在Python 2/3代码中使用,以确保成员顺序一致(类属性,在类创建期间删除)
  •   
  • _generate_next_value_ –由Functional API和自动使用,以获取枚举成员的适当值;可能会被覆盖
  •   

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

1 个答案:

答案 0 :(得分:5)

未对它们进行任何特殊处理。枚举模块正在使用它们,以便

  • 不要被意外覆盖

例如

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

您可以看到Status.missingStatus._missing_是不同的对象。如果允许使用_sunder_名称,则我们可能会意外覆盖_missing_函数,这将导致意外错误。

  • 不显示为私人。 python中的名称_value被认为是私有的。为了表示这些不是私有的(用户可能再次希望枚举值是私有的),它们取而代之的是破音名称

  • 如上所述,
  • 其他替代方法,例如__double_leading_underscore__dunder__在python中也有特殊含义。 _sunder_中的Enum方法的行为类似于纯python的_dunder_协议,但该语言并没有保留。

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