Dystrybucja pojedynczego pliku Python: moduł czy pakiet?

24

Załóżmy, że mam przydatną funkcję lub klasę (lub cokolwiek) w języku Python, useful_thingktóra istnieje w jednym pliku. Istnieją dwa podstawowe sposoby organizacji drzewa źródłowego. Pierwszy sposób wykorzystuje pojedynczy moduł:

- setup.py
- README.rst
- ...etc...
- foo.py

gdzie useful_thingjest zdefiniowany w foo.py. Druga strategia polega na stworzeniu pakietu:

- setup.py
- README.rst
- ...etc...
- foo
|-module.py
|-__init__.py

gdzie useful_thingjest zdefiniowany w module.py. W pudełku __init__.pywyglądałoby to tak

from foo.module import useful_thing

więc w obu przypadkach możesz to zrobić from foo import useful_thing.

Pytanie: Który sposób jest preferowany i dlaczego?

EDYCJA: Ponieważ użytkownik gnat mówi, że to pytanie jest źle sformułowane, dodam, że oficjalny samouczek dotyczący pakowania w Pythonie nie wydaje się komentować, która z metod opisanych powyżej jest preferowana. Wyraźnie nie podam mojej osobistej listy zalet i wad, ponieważ interesuje mnie, czy istnieje metoda preferowana przez społeczność, a nie generowanie dyskusji na temat zalet i wad :)

DanielSank
źródło
Udostępnianie badań pomaga wszystkim . Powiedz nam, co próbowałeś i dlaczego nie spełnia twoich potrzeb. To pokazuje, że poświęciłeś trochę czasu, aby spróbować sobie pomóc, oszczędza nam to powtarzania oczywistych odpowiedzi, a przede wszystkim pomaga uzyskać bardziej konkretną i odpowiednią odpowiedź. Zobacz także How to Ask
komnata
1
@gnat: Dzięki za link do tego, jak zapytać. Zdaję sobie sprawę z dobrej praktyki zadawania pytań, ale w tym przypadku nie uważałem za stosowne dać mojego doświadczenia, ponieważ prawdopodobnie zamieniłoby to, co zadałem jako jasne pytanie „A lub B”, w prośbę o opinie. Jak poleciłbyś ulepszenie tego pytania bez oparcia go na opinii?
DanielSank
@gnat: Innymi słowy, gdybym był zainteresowany listą zalet / wad tych dwóch metod, zapytałbym „Jakie są zalety i wady tych dwóch metod” i dodałbym własną listę częściową.
DanielSank

Odpowiedzi:

17

Robisz najprostszą rzecz, która Ci odpowiada .

W przypadku modułu jednofunkcyjnego nie ma absolutnie żadnego sensu tworzenie pakietu. Pakiety są przydatne do tworzenia dodatkowej przestrzeni nazw i / lub do organizowania kodu w wielu modułach.

jsonI unittestmoduły w standardowej biblioteki Pythona są naprawdę pakiety na przykład, dla celów organizacyjnych kod. Ale doskonale jest pozostawić kod, który obecnie znajduje się w jednym pliku Pythona, jako jeden moduł.

Jeśli chcesz przykłady:

Dobry przykład projektów, które naprawdę doskonale wykorzystują pakiety, spójrz na:

Nie ma „oficjalnej” rekomendacji; obie opcje są całkowicie ważne.

Martijn Pieters
źródło
Więc nie ma oficjalnie preferowanej metody?
DanielSank
3
Nie, nie ma preferowanej metody.
Martijn Pieters