Skip to main content
 首页 » 编程设计

Python 导入模块与导入_模块

2025年05月04日11kenshinobiy

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

所以我打开了一个 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 module 和 import _module 有什么区别呢? 它背后是否有约定或类似的东西?

请您参考如下方法:

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

例如参见 csv.py module ;它从 _csv.c C library 导入对于大部分功能,只有 Dialect、Sniffer、DictReader 和 DictWriter 类是用纯 Python 实现的。

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