API eines Pakets in Python. In __init__.py?

8

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?

    
pierocampanelli 17.07.2010, 14:09
quelle

3 Antworten

10

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!

    
Alex Martelli 17.07.2010, 15:42
quelle
7

Die __init__.py -Datei ist ein akzeptabler Platz, um die öffentliche API oder ein Paket zusammen mit den anderen Modulen innerhalb der Implementierung bereitzustellen.

    
Ignacio Vazquez-Abrams 17.07.2010 14:16
quelle
3

Es gibt Nachteile , um die API in __init__.py :

zu setzen
  • es besteht die Gefahr, zyklische Abhängigkeiten zu verursachen
  • Es ist kein naheliegender Ort, wenn Sie nach einer Codebasis suchen

Wenn Sie die API in einem speziellen Modul wie api.py platzieren, werden diese Probleme erhöht. Darüber hinaus gibt es Vorteile wie:

  • Sie können später in einem zweiten Modul (vereinfachter, anderer Anwendungsfall usw.)
  • eine andere API anbieten
  • große Python-Projekte wie Enthought traits.api und Trac trac.api verwende dieses Muster
Bernhard Kausler 14.09.2011 09:51
quelle

Tags und Links