Wie kann man Importe in einem Projekt universell organisieren, unabhängig davon, wo sich die Module befinden?

Zunächst einmal ist dieser Artikel ein Verstoß gegen das heilige Fundament der Python-Entwicklergemeinschaft, das Fundament klingt wie „Python-Syntax ist perfekt, Standardbibliotheken sind perfekt und vollständig, GIL ist ein unvermeidliches Opfer für eine so schöne Sprache wie Python . .. vielleicht am Ende Jahrhundertelang werden die Menschen herausfinden, wie sie damit umgehen, aber für jetzt, also 🥺“. Wir entschuldigen uns zutiefst für einen solchen Artikel, dies ist ein rein humorvoller Artikel, Sie sollten ihn nicht ernst nehmen.

Im Allgemeinen kann dieses Problem in 50 Zeilen gelöst werden, hier ist der Code zum Importieren eines Moduls von überall, ohne mit Tamburinen und `sys.path` zu tanzen

importlib.util aus importlib.machinery import ModuleSpec aus os import sep aus os.path import splitext, join aus pathlib import Path, PosixPath aus types import ModuleType aus typing import Optional, Union class ObjFrom: def __init__(self, module: ModuleType) : self.module: ModuleType = module def From(self, *obj): “”” Auswahl durch Definition von Objekten aus Modul :param obj: :return: “”” return tuple(v für k, v in self.module.__dict__ . items() if k in obj) def iimport(self_file: str = None, count_up: int = 0, module_name: str = None, *, absolute_path: Union[str, Path] = None) -> ObjFrom: “”” Datei als `python`-Modul importieren :param self_file: Normalerweise __file__ :param count_up: Wie viele Ordner hochgefahren werden sollen :param module_name: Modulname importieren :param absoluter_pfad: Pfad zur `python`-Datei : return: `python` module “”” path: str=”” if absolute_path is not None: if isinstance(absolute_path, PosixPath): absolute_path = absolute_path.__str__() path = absolute_path else: path = join(sep.join( Pfad (self_file).parts[:(count_up + 1) * -1]), f”{Modulname}.py”) if splitext(Pfad)[1] != “.py”: Erhöhen Sie ValueError(f”Die Dateierweiterung muss .py sein”) spec: Optional[ModuleSpec] = importlib.util.spec_from_file_location(“my_module”, path) __module: ModuleType = importlib.util.module_from_spec(spec) spec.loader.exec_module(__module) return ObjFrom(__module)

Wie benutzt man ?

Aber so. Benötigen Sie ein Modul aus einem anderen Universum? Bitte geben Sie einen absoluten Pfad dazu an und nehmen Sie ihn.

Modulname = iimport(absolute_path=”Path”).module

Okay, aber das Schreiben eines absoluten Pfads ist nicht immer praktisch. Zum Beispiel liegt unser Modul mehrere Ebenen von Verzeichnissen hoch, und was schreibt man dann den absoluten Pfad 😡 ? Nun, nein, Sie können einen solchen Fall verwenden

Modulname = iimport(__file__, HowDirUp, ‘Modulname’).module

Ich spüre, wie dich jugendliche Freude über so eine neue Entdeckung überkommt. Wie viele Features öffnen sich jetzt vor dir ☺?? Aber wie sie im Restaurant sagen – Dessert wird am Ende serviert.

Wenn wir bestimmte Objekte aus dem Modul abrufen müssen, können wir diesen Fall verwenden

Objekt_1, Objekt_N = iimport(absolute_path=”Pfad”).From(‘Objekt_1’, ‘Objekt_N’)

Der Artikel ist fertig, eine große Verbeugung vor der Öffentlichkeit und den Lesern, die diese Linie erreicht haben. Mit freundlichen Grüßen, Ihrer ist ein mittelmäßiger Programmierer, der keinen Fuß in Python hat 🙂

Similar Posts

Leave a Reply

Your email address will not be published.