3 Stimmen

Wie strukturiere ich Python-Code in Modulen/Paketen?

Nehmen wir an, ich habe diese einfache Struktur:

project/
  main.py
  providers/
    __init.py__
    acme1.py
    acme2.py
    acme3.py
    acme4.py
    acme5.py
    acme6.py

Angenommen, dass main.py enthält (teilweise):

if complexcondition():
  print providers.acme5.get()

Wo __init__.py leer ist und acme*.py enthalten (teilweise):

def get():
  value=complexcalculation()
  return value

Wie kann ich diese Dateien ändern, damit sie funktionieren?

Hinweis: Wenn die Antwort "import acme1", "import acme2" usw. in __init__.py Gibt es eine Möglichkeit, dies zu erreichen, ohne sie alle von Hand aufzulisten?

6voto

remosu Punkte 4959

Hey! Zwei Jahre später, aber... vielleicht kann ich jemandem helfen

machen Sie Ihre providers/__init__.py so:

import os
import glob

module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]

Sie müssen sie später nicht ändern, wenn Sie etwas hinzufügen oder entfernen providers/acme*.py

dann verwenden Sie from providers import * sur main.py

5voto

TwentyMiles Punkte 3943

Wenn ich Ihre Frage richtig lese, sieht es so aus, als ob Sie nicht versuchen, einen dynamischen Import durchzuführen (wie in der Frage, die Van Gale erwähnt hat), sondern tatsächlich versuchen, einfach alle Module im Anbieterpaket zu importieren. Wenn das der Fall ist, muss in __init__.py würden Sie diese Aussage haben wollen:

__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]

Um dann alles zu importieren, was Sie von ... import * verwenden würden

from providers import *

Anstatt den Paketnamen explizit im Code zu verwenden, rufen Sie dann einfach die importierten Klassen auf

acme1.get()
acme2.get()

Wenn Sie so viele Module im Anbieterpaket haben, dass es zu einem Problem wird, die __all__ Liste, sollten Sie sich überlegen, ob Sie sie in kleinere Pakete aufteilen oder die Daten auf andere Weise speichern wollen. Ich persönlich möchte mich nicht jedes Mal mit dem dynamischen Import von Schennagins herumschlagen müssen, wenn ich das Paket wiederverwenden möchte.

3voto

Van Gale Punkte 42727

Diese Frage wurde heute gestellt, Dynamisches Laden von Python-Modulen sollten Sie Ihre Antwort haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X