Модуль против пакета?

140

Всякий раз, когда я это делал, from 'x' import 'y'мне было интересно, какой из них считается «модулем», а какой «пакетом», и почему это не наоборот?

Темный тамплиер
источник
1
Относительно того, почему это не наоборот, см stackoverflow.com/questions/3600352/...
1
Я, например, благодарен за этот вопрос, потому что ответ краткий и дает именно необходимые знания. Документация все в порядке, но она многословна и содержит гораздо больше информации, чем то, о чем просил ОП, и, конечно, больше, чем мне нужно. Я просто хотел получить ответ на этот конкретный вопрос, и ответ ниже - именно то, что я хотел. Многим из нас просто не нужны такие формальные или подробные ответы.
Teekin
Понятие, которое нужно знать - классы и модули в Python
RBT

Ответы:

192

Модуль Python - это просто исходный файл Python, который может предоставлять классы, функции и глобальные переменные.

При импорте из другого исходного файла Python имя файла обрабатывается как пространство имен.

Пакет Python - это просто каталог модулей (модулей) Python.

Например, представьте следующее дерево каталогов в /usr/lib/python/site-packages:

mypackage/__init__.py <-- this is what tells Python to treat this directory as a package
mypackage/mymodule.py

Итак, вы бы сделали:

import mypackage.mymodule

или же

from mypackage.mymodule import myclass
Ям Маркович
источник
Ага, поэтому, когда вы говорите, что имя файла рассматривается как пространство имен, вы бы так что-то вроде этого? «mymodule.var1» для первого случая или «myclass.var1» для второго?
Темный тамплиер
1
Не совсем. Пакет по-прежнему считается частью пространства имен. Если вы хотите сделать то, что вы сказали, то вам нужно сделать из mypackage import mymodule.
Ям Маркович
Возможно, было бы полезно добавить что-то о пакетах пространства имен, для которых не обязательно, чтобы весь код появлялся в одном и том же дереве каталогов.
holdenweb
@holdenweb Никогда не использовал различные механизмы, задействованные там напрямую, поэтому не эксперт. Если вы дадите подробное объяснение об этом в новом ответе, я сошлюсь на него от моего.
Ям Маркович
Наверное, слишком эзотерично, чтобы стоить того - ретроспективно
holdenweb