Python文件名前缀下划线的含义是什么?

35

比如,在 cherryPy 中,有以下文件:

  • __init__.py
  • _cptools.py

它们有何不同?这意味着什么?

4个回答

44

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

在这个例子中,__init__.py 定义了一个包的“主”单元;它还会使 Python 将特定目录视为包。当您调用 import cherryPy(而 cherryPy 是一个目录)时,将使用这个单元。这在 模块教程 中简要解释。

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

_... 经常用作“内部”名称。例如,以 _ 开头的模块不应直接使用;类似地,具有 _ 的方法被认为是私有的等等。这只是一个约定,但您应该尊重它。


6
你并没有被明确禁止发明自己的名称。这是因为语言可能会在未来增加更多此类名称,所以保留了命名空间,但不建议这样做。对于你自己的项目,使用 __...__ 的名称是有风险的。 - Martijn Pieters
2
@MartijnPieters:好的,已将其替换为“不应该”。 - Michał Górny

19

这些以及其他的命名约定在Python代码样式指南-描述性:命名风格中有详细描述。

简单来说:

  • __double_leading_and_trailing_underscore__:用于存储在用户控制的命名空间中的“魔法”对象或属性,例如 __init__ __import__ __file__ 。不要自己创造这种命名方式,只能按照文件中记录的方式使用。
  • _single_leading_underscore:弱内部使用指示器。例如, from M import * 不会导入名称以下划线开头的对象。

8

__init__.py是一个特殊的文件,当它存在于一个文件夹中时,就会将该文件夹转换为模块。导入模块时,__init__.py会被执行。另一个是命名约定,但我想这意味着您不应直接导入该文件。

在这里查看:6.4. Packages,了解如何创建模块的说明。

一般规则:如果Python中的任何内容都被命名为__anything__,那么它都是特殊的,您应该在使用之前阅读相关文档(例如魔术函数)。


3
当前选择的答案已经对__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__定义的公开实体),因此所有文件名甚至都不可见,更不用说成为使用文件(即模块)的因素了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接