什么时候使用python分解器名称?
在Python中,有单前导下划线、双前导下划线、双前导+双尾随下划线和单尾随下划线的约定。这些问题的答案中有很多都有概述 但单前导+单尾随下划线的含义或惯例是什么?我第一次看到它们的用途是: 8.13.15.3.2。支持的什么时候使用python分解器名称?,python,enums,naming-conventions,underscores,Python,Enums,Naming Conventions,Underscores,在Python中,有单前导下划线、双前导下划线、双前导+双尾随下划线和单尾随下划线的约定。这些问题的答案中有很多都有概述 但单前导+单尾随下划线的含义或惯例是什么?我第一次看到它们的用途是: 8.13.15.3.2。支持的\u sunder\u名称 \u名称–成员的名称 \u值–成员的值;可在新建中设置/修改 \u缺失–未找到值时使用的查找功能;可能会被推翻 \u ignore\u–名称列表,可以是list()或str(),不会转换为成员,并将从最终类中删除 \u顺序–在Python 2/3代
\u sunder\u
名称
–成员的名称\u名称
–成员的值;可在新建中设置/修改\u值
–未找到值时使用的查找功能;可能会被推翻\u缺失
–名称列表,可以是list()或str(),不会转换为成员,并将从最终类中删除\u ignore\u
–在Python 2/3代码中使用,以确保成员顺序一致(类属性,在类创建过程中删除)\u顺序
–由函数API和自动使用,为枚举成员获取适当的值;可能会被推翻\u generate\u next\u value
我以前从未见过这样一个前导下划线分隔的名字。它们是否以任何特殊方式处理,或以其他方式具有不同于任何其他下划线相关命名约定的隐含含义?它们与没有下划线有什么区别?它们没有任何特殊的处理方式。枚举模块正在使用它们,以便
- 不被意外覆盖
Status.missing
和Status.\u missing\u
是不同的对象。如果枚举方法\u missing\u
被命名为missing
,我们将覆盖它
- 不以私人身份出现。python中的名称
被认为是私有的。为了表示它们不是私有的(同样,用户可能希望枚举值是私有的),它们被赋予了不同的名称\u值
- 其他替代方案,如
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu下划线
方法的行为类似于纯python的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<
中的code>\u sunderEnum
协议,但不为该语言所保留\u dunder\u
基本上,这是一种避免属性名称冲突而不会给人错误印象的选项。但是
\u name\u
和\u value\u
是枚举
类型上的属性,而不是元类枚举元
上的属性<代码>类测试(枚举):a=0,然后Test.a._name
,Test._name
但是会产生AttributeError
。我可以看到需要如何防止EnumMeta
上的属性名称冲突,但是结果Enum
类型上的冲突风险在哪里?此外,Test.a.name
和Test.a.value
也起作用,因此看来,\u name
和\u value
分别只是name
和value
的同义词。作为Enum
的作者,我同意这个答案。;-)值得指出的是,流行的Jupyter REPL和可视化框架(包括其强大支持下的IPython)在某种程度上广泛使用了“sunder”——命名的属性和方法,例如\u repr\u jpeg\u
和\u repr\u html
,为了在其增强的REPL环境中为兼容的Python对象提供定制呈现(q.v.详细信息见上文)。@gerrit:您的问题的答案比我想在评论中提到的要复杂得多。如果你把它作为一个新问题问,我很乐意回答。
class Status(Enum):
alive = auto()
dead = auto()
missing = auto()