python文件名的下划线前缀是啥?

Posted

技术标签:

【中文标题】python文件名的下划线前缀是啥?【英文标题】:What is the underscore prefix for python file name?python文件名的下划线前缀是什么? 【发布时间】:2012-08-30 07:46:51 【问题描述】:

cherryPy 为例,有如下文件:

__init__.py _cptools.py

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

【问题讨论】:

【参考方案1】:

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

在这个特定的示例中,__init__.py 定义了包的“主”单元;它还导致 Python 将特定目录视为一个包。它是您调用import cherryPy 时将使用的单位(而cherryPy 是一个目录)。这在Modules tutorial中有简要说明。

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

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

【讨论】:

没有明确禁止您发明自己的名字。 不鼓励,因为该语言将来可能会添加更多此类名称,因此保留了命名空间。为您自己的项目使用 __...__ 名称需要您自担风险。 @MartijnPieters:好的,将其替换为“不应该”。【参考方案2】:

Style Guide for Python Code - Descriptive: Naming Styles 中详细描述了这些和其他命名约定

简单地说:

__double_leading_and_trailing_underscore__:存在于用户控制的命名空间中的“魔法”对象或属性。例如__init____import____file__。永远不要发明这样的名字;仅按文档说明使用。 _single_leading_underscore:弱“内部使用”指标。例如。 from M import * 不会导入名称以下划线开头的对象。

【讨论】:

【参考方案3】:

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

看看这里:6.4. Packages 了解如何创建模块。

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

【讨论】:

【参考方案4】:

当前选择的答案已经很好地解释了__init__.py 的双下划线符号。

而且我相信在文件名中没有真正需要_cptools.py 符号。应用Style Guide for Python Code - Descriptive: Naming Styles 中的“单前导下划线”规则可能是不必要的扩展用法:

_single_leading_underscore:弱“内部使用”指标。例如。 from M import * 不会导入名称以下划线开头的对象。

如果有的话,上述样式指南实际上是反对在文件名中使用_single_leading_underscore.py。它的Package and Module Names section 仅在以 C/C++ 实现模块时提及此类用法。

一般来说,_single_leading_underscore 符号通常出现在函数名、方法名和成员变量中,以将它们与其他普通方法区分开来。

几乎不需要(如果有的话)在文件名上使用_single_leading_underscore.py,因为开发人员不是scrapers,他们不太可能根据文件名来挽救文件。他们只会遵循包的***别的 API(从技术上讲,它的暴露实体由 __all__ 定义),因此所有文件名甚至都不明显,更不用说成为文件(即模块)是否会被引用的一个因素用过。

【讨论】:

以上是关于python文件名的下划线前缀是啥?的主要内容,如果未能解决你的问题,请参考以下文章

属性和方法名称的下划线前缀仅仅是一种约定吗?

编译器在函数名称前加上下划线的原因是啥?

python中的双下划线__是啥意思? [复制]

关于windows文件命名的规定正确的是啥

webpack 的 sass-loader 找不到没有下划线前缀的基础 scss 文件

python命名规则是啥?