28

例如cherryPy,有如下文件:

  • __init__.py
  • _cptools.py

它们有何不同?这是什么意思?

4

4 回答 4

38

__...__表示保留的 Python名称(在文件名和其他名称中)。您不应该使用双下划线符号来发明自己的名字;如果您使用现有的,它们具有特殊的功能。

在此特定示例中,__init__.py定义了包的“主要”单元;它还导致 Python 将特定目录视为一个包。它是您调用时将使用的单位import cherryPy(并且cherryPy是一个目录)。模块教程中对此进行了简要说明。

另一个例子是__eq__为类提供相等比较的方法。您可以直接调用这些方法(==例如,当您使用运算符时,您可以隐式使用它们);但是,较新的 Python 版本可能会定义更多这样的方法,因此您不应该发明自己的__-names,因为它们可能会发生冲突。您可以在数据模型文档中找到此类方法的详细列表。

_...通常用作“内部”名称。例如,_不应该直接使用以 开头的模块;同样,带有_的方法应该是私有的,依此类推。这只是一个约定,但你应该尊重它。

于 2012-08-30T07:51:35.733 回答
16

Python 代码的样式指南 - 描述性:命名样式中详细描述了这些和其他命名约定

简要地:

  • __double_leading_and_trailing_underscore__: 存在于用户控制的命名空间中的“神奇”对象或属性。例如__init____import____file__。永远不要发明这样的名字;仅按记录使用它们。
  • _single_leading_underscore:弱“内部使用”指标。例如from M import *,不导入名称以下划线开头的对象。
于 2012-08-30T07:54:01.957 回答
8

__init__.py是一个特殊文件,当它存在于文件夹中时,该文件夹会变成模块。导入模块后,__init__.py执行。另一个只是一个命名约定,但我猜这会说您不应该直接导入该文件。

看看这里:6.4。用于解释如何创建模块的包。

一般规则:如果 Python 中有任何东西是命名的,__anything__那么它就是特别的东西,你应该在使用它之前阅读它(例如魔术函数)。

于 2012-08-30T07:53:29.737 回答
1

当前选择的答案已经很好地解释了__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__),因此所有文件名甚至都不明显,更不用说成为是否使用文件(即模块)的一个因素。

于 2019-05-15T00:04:12.783 回答