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


140

Кожного разу мені from 'x' import 'y'було цікаво, який з них вважається «модулем», а який - «пакетом», і чому це не навпаки?


1
Щодо того, чому це не навпаки, см stackoverflow.com/questions/3600352 / ...

1
Я, наприклад, вдячний за це запитання, оскільки відповідь є стислим і дає точно необхідні знання. Документація - це все добре і просто, але вона є багатослівною і містить більше інформації, ніж те, що просила ОП, і, звичайно, більше, ніж мені потрібно. Я просто хотів відповісти на це конкретне запитання, і відповідь нижче - саме те, що я хотів. Багатьом з нас просто не потрібні такі формальні чи глибокі відповіді.
Тікін

Пов'язана концепція, щоб знати - Класи проти модулів в 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
Не зовсім. Пакет все ще вважається частиною простору імен. Якщо ви хочете зробити те, що ви сказали, то вам потрібно зробити мій модуль імпортувати мій пакунок.
Ям Маркович

Можливо, буде корисно додати щось про пакети простору імен, для яких код необов'язково повинен з’являтися в одному дереві каталогів.
holdenweb

@holdenweb Ніколи не використовував різні механізми, які там безпосередньо задіяні, тому не експерт. Якщо ви дасте детальне пояснення про це у новій відповіді, я посилаюсь на нього з моєї.
Ям Маркович

Напевно, трохи надто езотеричне, щоб того варто було, в ретроспективі
holdenweb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.