【问题标题】:Python import module vs import _modulePython 导入模块与导入 _module
【发布时间】:2013-04-11 09:35:48
【问题描述】:

在 Aptana 中配置 PyDev 的 Forced Builtins 时,我注意到默认情况下使用 _(下划线)前缀引用了一些模块。

所以我打开了一个 Python 解释器,令我惊讶的是,下面的导入工作:

import ast
import _ast
import bisect
import _bisect
import csv
import _csv
# ... and so on

现在,如果我对导入的模块执行dir(),我会看到不同的内容:

>>> dir(csv)
['Dialect', 'DictReader', 'DictWriter', 'Error', ...] # and so on
>>> dir(_csv)
['Dialect', 'Error', ...] # node that DictReader and DictWriter are missing

最后,help() 告诉我它们显然是不同的模块:

>>> help(_csv)
Help on module _csv:

NAME
    _csv - CSV parsing and writing.

FILE
    /usr/lib64/python2.6/lib-dynload/_csv.so
...

>>> help(csv)
Help on module csv:

NAME
    csv - CSV parsing and writing.

FILE
    /usr/lib64/python2.6/csv.py
...

那么,import moduleimport _module 有什么区别? 它背后是否有约定或类似的东西?

【问题讨论】:

    标签: python python-import python-module


    【解决方案1】:

    一些模块使用一些 C 代码来实现需要速度的部分。 main 模块仍然使用 Python 胶水,_module 版本包含 C 扩展。

    例如见csv.py module;它从_csv.c C library 导入大部分功能,只有DialectSnifferDictReaderDictWriter 类在纯Python 中实现。

    module 加上 _module 约定就是这样,约定。并非所有 C 扩展都遵循这种模式。

    【讨论】:

      【解决方案2】:

      _module 通常是用 C 编写的模块的一部分。module 是围绕它的 python 包装器。您永远不需要自己导入_modules

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 1970-01-01
        • 2014-01-09
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2018-04-23
        相关资源
        最近更新 更多