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


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.