2013-04-11 181 views
1

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

于是我打开一个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之间有什么区别? 背后是否有一个约定或类似的东西?

回答

5

某些模块使用一些 C代码来实现需要速度的零件。 主要的模块仍然使用Python胶水,而_module版本包含C扩展。

参见例如csv.py module;它从大多数功能的_csv.c C library进口,只有在纯Python中实现的DialectSnifferDictReaderDictWriter类。

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

4

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