python模块名称前的前导下划线

时间:2019-03-14 08:00:36

标签: python

我已经搜索了这个,但是没有找到任何答案。我正在看别人写的python代码,有一个模块说“ GUI_Module”。 该模块包含一个类,其中包含与GUI相关的方法。然后将该模块导入使用这些方法的__main__ python文件中。

与其以实际名称像这样导入:

import GUI_Module

它是这样导入的,并带有下划线:

import _GUI_Module

现在,我了解python中下划线的大多数含义,但是我还没有发现任何能够解释我们要导入的模块名称之前的下划线应该做什么的东西。

3 个答案:

答案 0 :(得分:2)

在CPython中实现标准库时,_前缀似乎表明模块是“私有的”,从某种意义上说,您不应直接导入它。通常,这是因为其功能是由某些“公开的”文档化模块导入和公开的。

这样的私有模块 可能是accelerator module-一种快速的C实现,与同一个模块的较慢的纯Python实现同时存在(纯Python版本试图将其实现)从中导入所有内容,以便始终自动使用更快的版本(如果有)。

尽管并非所有用C实现的模块都是加速器模块。在某些情况下,用C编写的带有_前缀的模块是唯一可用的实现。例如,CPython不包含ctypessqlite模块的纯Python实现;这些模块分别依赖于从_ctypes_sqlite3模块(用C实现)中导入内容,因此不支持Python C语言的Python解释器无法使用它们。

并非所有_前缀的模块都在C中实现!例如,_pydecimal模块是decimal模块的纯Python实现。 implementation of decimal in CPython尝试实现_decimal(在C中实现)(如果可用),否则,则尝试导入_pydecimal

这些带有_前缀的模块似乎普遍适用,唯一的事实是它们都是一些没有_且已记录的“公共”模块的实现细节,前缀,那么您应该使用 that 模块,而不是直接从带有_前缀的内容中导入内容。

答案 1 :(得分:1)

与添加任何其他字符相同。模块名称更改,导致导入了另一个模块。

还有一个约定,即以下划线开头的名称是内部名称,不应由客户端使用。

答案 2 :(得分:0)

在Python标准库中,模块名称中的下划线表示加速器模块:用C编写的模块,可提供更高性能的纯Python版本实现,例如{{1 }}和_csv。加速器模块在PEP-399中进行了描述。

在标准库之外,下划线通常表示专用模块,该模块不应直接使用。这可能是因为主模块包含程序包的公共API,而下划线版本包含与实现或平台相关的代码。