2013-09-01 2 views
7

У меня возник вопрос о том, как работают библиотеки типа numpy. Когда я импортирую numpy, мне предоставляется доступ к множеству встроенных классов, функций и констант, таких как numpy.array, numpy.sqrt и т. Д.Модули Python с подмодулями и функциями

Но в пределах numpy есть дополнительные подмодули, такие как numpy.testing.

Как это делается? В моем ограниченном опыте модули с подмодулями - это просто папки с файлом инициализации . .py, а модули с функциями/классами являются фактическими файлами python. Как создать модуль «папка», который также имеет функции/классы?

ответ

17

Папка с файлами .py и __init__.py называется package. Один из этих файлов, содержащих классы и функции, - module. Вложение папок может дать вам подпакеты.

Так, например, если бы я имел следующую структуру:

mypackage 
    __init__.py 
    module_a.py 
    module_b.py 
     mysubpackage 
      __init__.py 
      module_c.py 
      module_d.py 

я мог бы импортировать mypackage.module_a или mypackage.mysubpacakge.module_c и так далее.

Вы также можете добавить функции к mypackage (например, о функциях numpy, о которых вы упомянули), поместив этот код в __init__.py. Хотя это обычно считается уродливым.

Если вы посмотрите на numpy's __init__.py, вы увидите там много кода - многие из них определяют эти классы и функции верхнего уровня. Код __init__.py - это первое, что выполняется при загрузке пакета.

+0

Тогда как можно импортировать библиотеку типа numpy или scipy и содержать как классы/функции (например, модуль), так и другие модули (например, пакет). Так что я могу сделать numpy.array (класс) или numpy.testing.assert ... (получение модуля). – ImpGuard

+0

Я только что ответил, что все это в '__init __. Py'. Любая функция там будет первоклассным членом пакета, когда он загружается интерпретатором. –

+0

А, вот что мне интересно. Я думал, что это будет считаться уродливым, так как много раз. логика пошла бы в нее. Я предполагаю, что все было по-разному закодировано и как-то все объединено в __init__.py после? Кажется довольно полезным иметь что-то подобное, но я не уверен, как его реплицировать, не просто сбрасывая много кода в один файл. – ImpGuard

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