例如cherryPy
,有如下文件:
__init__.py
_cptools.py
它们有何不同?这是什么意思?
__...__
表示保留的 Python名称(在文件名和其他名称中)。您不应该使用双下划线符号来发明自己的名字;如果您使用现有的,它们具有特殊的功能。
在此特定示例中,__init__.py
定义了包的“主要”单元;它还导致 Python 将特定目录视为一个包。它是您调用时将使用的单位import cherryPy
(并且cherryPy
是一个目录)。模块教程中对此进行了简要说明。
另一个例子是__eq__
为类提供相等比较的方法。您可以直接调用这些方法(==
例如,当您使用运算符时,您可以隐式使用它们);但是,较新的 Python 版本可能会定义更多这样的方法,因此您不应该发明自己的__
-names,因为它们可能会发生冲突。您可以在数据模型文档中找到此类方法的详细列表。
_...
通常用作“内部”名称。例如,_
不应该直接使用以 开头的模块;同样,带有_
的方法应该是私有的,依此类推。这只是一个约定,但你应该尊重它。
Python 代码的样式指南 - 描述性:命名样式中详细描述了这些和其他命名约定
简要地:
__double_leading_and_trailing_underscore__
: 存在于用户控制的命名空间中的“神奇”对象或属性。例如__init__
,__import__
或__file__
。永远不要发明这样的名字;仅按记录使用它们。_single_leading_underscore
:弱“内部使用”指标。例如from M import *
,不导入名称以下划线开头的对象。当前选择的答案已经很好地解释了__init__.py
.
而且我相信文件名中没有真正需要_cptools.py
符号。应用Python 代码样式指南中的“单前导下划线”规则可能是不必要的扩展用法- 描述性:命名样式:
_single_leading_underscore
:弱“内部使用”指标。例如from M import *
,不导入名称以下划线开头的对象。
如果有的话,上述样式指南实际上是反对在文件名中使用_single_leading_underscore.py
的。它的包和模块名称部分仅在使用 C/C++ 实现模块时提及此类用法。
通常,该_single_leading_underscore
符号通常在函数名称、方法名称和成员变量中观察到,以将它们与其他常规方法区分开来。
几乎不需要(如果有的话)_single_leading_underscore.py
在文件名上使用,因为开发人员不是刮板,他们不太可能根据文件名来挽救文件。它们只会遵循包的最高级别的 API(从技术上讲,它的暴露实体由 定义__all__
),因此所有文件名甚至都不明显,更不用说成为是否使用文件(即模块)的一个因素。