比如,在 cherryPy
中,有以下文件:
__init__.py
_cptools.py
它们有何不同?这意味着什么?
比如,在 cherryPy
中,有以下文件:
__init__.py
_cptools.py
它们有何不同?这意味着什么?
__...__
表示保留的 Python 名称(无论是在文件名还是其他名称中)。您不应该使用双下划线符号来发明自己的名称;如果使用现有名称,则它们具有特殊功能。
在这个例子中,__init__.py
定义了一个包的“主”单元;它还会使 Python 将特定目录视为包。当您调用 import cherryPy
(而 cherryPy
是一个目录)时,将使用这个单元。这在 模块教程 中简要解释。
另一个例子是 __eq__
方法,它为类提供相等比较。您可以直接调用这些方法(例如,使用 ==
运算符时会隐式地使用它们);但是,新版本的Python可能会定义更多这样的方法,因此您不应该发明自己的 __
名称,因为它们可能会冲突。您可以在 数据模型 文档中找到这些方法的相当详细的列表。
_...
经常用作“内部”名称。例如,以 _
开头的模块不应直接使用;类似地,具有 _
的方法被认为是私有的等等。这只是一个约定,但您应该尊重它。
这些以及其他的命名约定在Python代码样式指南-描述性:命名风格中有详细描述。
简单来说:
__double_leading_and_trailing_underscore__
:用于存储在用户控制的命名空间中的“魔法”对象或属性,例如 __init__
, __import__
或 __file__
。不要自己创造这种命名方式,只能按照文件中记录的方式使用。_single_leading_underscore
:弱内部使用指示器。例如, from M import *
不会导入名称以下划线开头的对象。__init__.py
是一个特殊的文件,当它存在于一个文件夹中时,就会将该文件夹转换为模块。导入模块时,__init__.py
会被执行。另一个是命名约定,但我想这意味着您不应直接导入该文件。
在这里查看:6.4. Packages,了解如何创建模块的说明。
一般规则:如果Python中的任何内容都被命名为__anything__
,那么它都是特殊的,您应该在使用之前阅读相关文档(例如魔术函数)。
__init__.py
中的双下划线符号进行了很好的解释。_cptools.py
标记并没有真正必要。这可能是应用了“单个前导下划线”规则的不必要扩展用法,来自Python代码风格指南 - 描述性:命名样式:
如果有什么需要的话,上述的代码风格指南实际上反对在文件名中使用
_single_leading_underscore
: 弱“内部使用”指示器。例如,from M import *
不会导入名称以下划线开头的对象。
_single_leading_underscore.py
。它的包和模块名称部分只在一个模块是用C/C++实现时提到了这种用法。_single_leading_underscore
符号仅在函数名、方法名和成员变量中使用,以将它们与其他普通方法区分开来。_single_leading_underscore.py
,因为开发人员不是scrapers,他们不太可能根据文件名恢复文件。他们只会遵循包的最高级别API(从技术上讲,即由__all__
定义的公开实体),因此所有文件名甚至都不可见,更不用说成为使用文件(即模块)的因素了。
__...__
的名称是有风险的。 - Martijn Pieters