我四处寻找这个,但我没有找到任何答案。我正在查看由其他人编写的 Python 代码,并且有一个模块说“GUI_Module”。该模块包含一个包含 GUI 相关方法的类。然后将该模块导入到__main__使用这些方法的Python 文件中。
而不是像这样以其实际名称导入:
import GUI_Module
Run Code Online (Sandbox Code Playgroud)
它是这样导入的,带有前导下划线:
import _GUI_Module
Run Code Online (Sandbox Code Playgroud)
现在我知道 Python 中下划线的大多数含义,但我还没有找到任何解释我们正在导入的模块名称之前的单个下划线应该做什么的任何内容。
在 CPython 中标准库的实现中,_前缀似乎表明模块是“私有的”,从某种意义上说,您不应该直接导入它。通常,这是因为它的功能是由一些“公共”的、记录在案的模块导入和公开的。
这样的私有模块可能是一个加速器模块——一个快速的 C 实现,它与同一模块的较慢的纯 Python 实现一起存在(并且纯 Python 版本试图从中导入所有内容,以便始终自动使用更快的版本如果可供使用的话)。
不过,并非所有用 C 实现的模块都是加速器模块。在某些情况下,_用 C 编写的-prefixed 模块是唯一可用的实现。例如,CPython 不包含ctypes或sqlite模块的纯 Python 实现;这些模块分别依赖于从_ctypesor_sqlite3模块(用 C 实现)导入的东西,因此不能被不支持 Python 的 C API 的 Python 解释器使用。
并不是所有带_前缀的模块都在 C 中实现!例如,_pydecimal模块是模块的纯 Python 实现decimal。在实施decimal中CPython的尝试实现_decimal(用C实现的),如果它是可用的,如果没有,回落到进口_pydecimal。
唯一似乎普遍适用于这些_-prefixed 模块的是,它们都是一些没有 -prefix 的记录在案的“公共”模块的实现细节_,并且您应该使用该模块代替直接从 -_前缀导入的东西。