Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候使用python分解器名称?_Python_Enums_Naming Conventions_Underscores - Fatal编程技术网

什么时候使用python分解器名称?

什么时候使用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代

在Python中,有单前导下划线、双前导下划线、双前导+双尾随下划线和单尾随下划线的约定。这些问题的答案中有很多都有概述

但单前导+单尾随下划线的含义或惯例是什么?我第一次看到它们的用途是:

8.13.15.3.2。支持的
\u sunder\u
名称

  • \u名称
    –成员的名称
  • \u值
    –成员的值;可在新建中设置/修改
  • \u缺失
    –未找到值时使用的查找功能;可能会被推翻
  • \u ignore\u
    –名称列表,可以是list()或str(),不会转换为成员,并将从最终类中删除
  • \u顺序
    –在Python 2/3代码中使用,以确保成员顺序一致(类属性,在类创建过程中删除)
  • \u generate\u next\u value
    –由函数API和自动使用,为枚举成员获取适当的值;可能会被推翻

我以前从未见过这样一个前导下划线分隔的名字。它们是否以任何特殊方式处理,或以其他方式具有不同于任何其他下划线相关命名约定的隐含含义?它们与没有下划线有什么区别?

它们没有任何特殊的处理方式。枚举模块正在使用它们,以便

  • 不被意外覆盖
e、 g

您可以看到
Status.missing
Status.\u missing\u
是不同的对象。如果枚举方法
\u missing\u
被命名为
missing
,我们将覆盖它

  • 不以私人身份出现。python中的名称
    \u值
    被认为是私有的。为了表示它们不是私有的(同样,用户可能希望枚举值是私有的),它们被赋予了不同的名称

  • 其他替代方案,如
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu下划线
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<
    Enum
    中的code>\u sunder
    方法的行为类似于纯python的
    \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()