Ich habe ein Python-Paket geschrieben, das aus mehreren .py
-Dateien besteht, die Klassen usw. enthalten. Ich möchte es mit dem Muster "Fassade" dem Kunden zugänglich machen. Daher möchte ich nicht, dass Clients alle internen Klassen lernen, sondern nur Methoden, die von dieser API-Schnittstelle bereitgestellt werden.
Frage ist: Wo stelle ich diese API? Definiere ich eine Datei api.py
innerhalb des Pakets oder kann ich diese API in das __init__.py
des Pakets einfügen?
Ich erkläre es besser mit einem Beispiel
%Vor%Also wo stelle ich die öffentliche API von?
Die häufigste Wahl ist die Verwendung von __init__.py
- es lohnt sich, zu einem eigenen Modul (oder mehr) auszuwandern, wenn es komplex genug ist, um es zu rechtfertigen (dann wäre es nicht viel von einer Fassade; - ) oder, was noch wichtiger ist, wenn Sie alternative APIs bereitstellen (eine vereinfachte mit reduzierter Funktionalität, aber größere Benutzerfreundlichkeit und beispielsweise eine reichhaltige / komplexe), in welchem Fall die Verwendung separater Module die Dinge besser organisiert.
Um Paket-Benutzern mitzuteilen, dass sie nicht sind, um andere Module direkt zu importieren, müssen Sie Ihre "privaten, internen Implementierungsmodule" mit einem führenden Unterstrich benennen : _core.py
, nicht core.py
und so weiter. Diese Konvention wird in Python immer verwendet, um öffentliche APIs von internen Implementierungsdetails zu trennen, und es lohnt sich, den (wirklich kleinen) Aufwand für die Implementierung zu implementieren!
Die __init__.py
-Datei ist ein akzeptabler Platz, um die öffentliche API oder ein Paket zusammen mit den anderen Modulen innerhalb der Implementierung bereitzustellen.
Es gibt Nachteile , um die API in __init__.py
:
Wenn Sie die API in einem speziellen Modul wie api.py platzieren, werden diese Probleme erhöht. Darüber hinaus gibt es Vorteile wie: