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文件名的下划线前缀是啥?的主要内容,如果未能解决你的问题,请参考以下文章