在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 名称。是否以任何特殊方式对待它们,或者它们具有与其他与下划线相关的其他命名约定不同的隐含含义?它们与根本没有下划线的地方有什么不同?
答案 0 :(得分:5)
未对它们进行任何特殊处理。枚举模块正在使用它们,以便
例如
class Status(Enum):
alive = auto()
dead = auto()
missing = auto()
您可以看到Status.missing
和Status._missing_
是不同的对象。如果允许使用_sunder_
名称,则我们可能会意外覆盖_missing_
函数,这将导致意外错误。
不显示为私人。 python中的名称_value
被认为是私有的。为了表示这些不是私有的(用户可能再次希望枚举值是私有的),它们取而代之的是破音名称
其他替代方法,例如__double_leading_underscore
和__dunder__
在python中也有特殊含义。 _sunder_
中的Enum
方法的行为类似于纯python的_dunder_
协议,但该语言并没有保留。
基本上,这是一个避免属性名称冲突而又不会给人留下错误印象的选项。