2012-12-14 2 views
2

Можно создать дубликат:
How do I find the location of Python module sources?Чтения предопределённых питон модулей

Я не понимаю, как читать код в встроенных модулях Python. Я знаю, как узнать, что там в модуле, например,

import os; 

dir(os) 

Но когда я пытаюсь посмотреть, например, для функции listdir я не могу найти def listdir читать то, что он на самом деле делает.

+0

Самый простой вариант заключается в [ посмотрите его в документах] (http://docs.python.org/3/library/index.html). –

+0

@Lattyware: Где документы говорят вам источник? Некоторые из модулей _do_ имеют ссылки на источник, обычно те, которые имеют в виду такие же примеры, как полезный код (например, 'asyncore'), но большинство из них не являются (например,' os'). – abarnert

+0

@abarnert Я взял «прочитал, что он на самом деле» означает, как использовать его, а не видеть источник. Вопрос немного неясен, но, перечитывая его, ваша интерпретация, вероятно, правильная. –

ответ

4

Одно слово: inspect.

Модуль проверки предоставляет несколько полезных функций, помогающих получать информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты кадра и объекты кода. Например, он может помочь вам изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной трассировки.

Это стандартная библиотека, а в документах есть примеры. Таким образом, вы просто print(inspect.getsource(os)) или сделать inspect.getsourcefile(os) и т.д.

Обратите внимание, что некоторые из стандартных модулей библиотеки написаны на языке С (или даже поддельные модулей встроены в интерпретатор), в этом случае getsourcefile возвращает ничего, но getfile по крайней мере, скажу вам, что это .so/.pyd/что угодно, что вы можете использовать для поиска исходного источника C в, скажем, копии исходного кода Python.

Вы также можете просто ввести help(os) и FILE на самом верху дает путь (как правило, такой же, как getsourcefile для модулей Python, таки getfile иначе).

И вы всегда можете перейти в онлайн-источник для Python modules и C extension modules. Просто измените «2.7» на «3.3» и т. Д. В URL-адресе, чтобы получить разные версии. (Я считаю, что если вы удалите версию полностью, вы получите код магистральный, в настоящее время, соответствующее 3,4 пре-альфа, но не цитируйте меня на этом.)

os.listdir функция фактически не определена непосредственно в os; это эффективно from <platform-specific-module> import * импортировано. Вы можете проследить его через несколько шагов самостоятельно, но обычно это будет posix_listdir в posixmodule.c на большинстве платформ. (Даже Windows, последние версии используют один и тот же файл, чтобы определить posix модуль на не-Windows, а nt и posix модули на Windows, и есть куча #if defined(…) вещи в коде.)

Смежные вопросы