何时使用python sunder名称?

ger*_*rit 14 python enums naming-conventions underscores

在Python中,存在单个前导下划线,双前导下划线,双前导+双尾下划线和单尾随下划线的约定.其中许多内容在对象名称之前的单个和双下划线的含义中是什么?.

但单一领先+单尾跟下划线的意义或惯例是什么?我第一次看到他们在enum模块中的使用:

8.13.15.3.2.支持的_sunder_名称

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

我还没有见过这样的单龙头单结尾下划线破甲之前的名字.它们是以任何特殊方式处理,还是具有与任何其他与下划线相关的命名约定不同的隐含含义?它们与没有下划线有何不同?

FHT*_*ell 6

它们没有以任何特殊方式处理.enum模块正在使用它们

  • 不要被意外地覆盖

例如

class Status(Enum):
    alive = auto()
    dead = auto()
    missing = auto()
Run Code Online (Sandbox Code Playgroud)

你可以看到它Status.missing并且Status._missing_是不同的对象.如果_missing_允许名称,我们可能会意外地覆盖missing会导致意外错误的函数.

  • 不是私人的._valuepython中的名称被认为是私有的.为了表示这些不是私有的(同样,用户可能希望枚举值是私有的),而是给出了sunder名称

  • 如其他替代品__double_leading_underscore,并__dunder__也有蟒蛇特殊的含义,你如上所述.行为中的_sunder_方法Enum类似于__dunder__纯python 的协议,但不是由语言保留的.

基本上,它可以选择避免属性名称冲突,而不会给出错误的印象.

  • 作为"Enum"的作者,我赞同这个答案.;-) (6认同)