Moduł vs. pakiet?

140

Ilekroć to from 'x' import 'y'robiłem, zastanawiałem się, który z nich jest uważany za „moduł”, a który „pakiet” i dlaczego nie jest odwrotnie?

Mroczny Templariusz
źródło
1
Jeśli chodzi o to, że nie jest odwrotnie, zobacz stackoverflow.com/questions/3600352/…
1
Ja, na przykład, jestem wdzięczny za to pytanie, ponieważ odpowiedź jest zwięzła i daje dokładnie potrzebną wiedzę. Dokumentacja jest w porządku i elegancka, ale jest pełna i zawiera o wiele więcej informacji niż to, o co prosił PO, a na pewno więcej niż potrzebowałem. Chciałem tylko odpowiedzieć na to konkretne pytanie, a odpowiedź poniżej jest dokładnie tym, czego chciałam. Wielu z nas po prostu nie potrzebuje takich formalnych lub szczegółowych odpowiedzi.
Teekin
Powiązana koncepcja do poznania - Klasy vs. moduły w Pythonie
RBT

Odpowiedzi:

192

Moduł Python to po prostu plik źródłowy Python, który może ujawniać klasy, funkcje i zmienne globalne.

Po zaimportowaniu z innego pliku źródłowego Python nazwa pliku jest traktowana jako przestrzeń nazw.

Pakiet Python to po prostu katalog modułów Pythona.

Na przykład wyobraź sobie następujące drzewo katalogów w /usr/lib/python/site-packages:

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

Więc zrobiłbyś:

import mypackage.mymodule

lub

from mypackage.mymodule import myclass
Yam Marcovic
źródło
Aha, więc kiedy mówisz, że nazwa pliku jest traktowana jako przestrzeń nazw, zrobiłbyś coś takiego? „mymodule.var1” w pierwszym przypadku, czy „myclass.var1” w drugim przypadku?
Dark Templar
1
Nie dokładnie. Pakiet nadal liczy się jako część przestrzeni nazw. Jeśli chcesz zrobić to, co powiedziałeś, musisz to zrobić z modułu mypackage import mymodule.
Yam Marcovic
Przydatne może być dodanie czegoś o pakietach przestrzeni nazw, dla których kod niekoniecznie musi pojawiać się w tym samym drzewie katalogów.
holdenweb,
@holdenweb Nigdy nie korzystałem z różnych mechanizmów tam związanych bezpośrednio, więc nie jestem ekspertem. Jeśli podasz szczegółowe wyjaśnienie na ten temat w nowej odpowiedzi, odniosę się do tego z mojego.
Yam Marcovic
Prawdopodobnie trochę zbyt ezoteryczny, aby warto było tego
dokonać