2013-04-11 3 views
1

При конфигурировании PyDev's Forced Builtins в Aptana я заметил, что по умолчанию некоторые модули ссылались на префикс _ (подчеркивание).Модуль импорта Python vs import _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 module и import _module? Есть ли соглашение за этим или что-то в этом роде?

ответ

5

Некоторые модули используют C код для реализации деталей, которым требуется скорость. Основной модуль по-прежнему использует клей Python, а версия _module содержит расширение C.

См. Например, csv.py module; он импортирует из _csv.c C library для большей части функциональности, только классы Dialect, Sniffer, DictReader и DictWriter реализованы в чистом Python.

module plus _module конвенция - это только, соглашение. Не все расширения C следуют этому шаблону.

4

_module обычно является частью модуля, который написан на C. module - это оболочка python вокруг него. Вам не нужно будет самостоятельно импортировать _modules.