Um zirkuläre Importe zu vermeiden, kann man import x
verwenden und dann x.func
jedes Mal verwenden. (vgl. Circular (or cyclic) imports in Python). (In meinem Fall, ich habe keine andere Wahl tatsächlich)Wie vermeiden Sie Nachschlage Overhead in Python mit voll qualifizierten Namen zu vermeiden zirkuläre Importe Probleme
Wenn jedoch x
zum Beispiel ist a.b.c.d.e
, dann erhalten Sie einen nicht zu vernachlässigenden Aufwand (zusätzlich zu der Lesbarkeit Problemen), vor allem, wenn Ihre Funktion wiederholt aufgerufen wird. Ich würde gerne wissen, ob es eine Art von Mechanismus zum Definieren von Verknüpfungen wie E = a.b.c.d.e
gibt, wenn die Importe aufgelöst werden?
Hinweis (oder etwas auf den Nachschlag-eachtime zu vermeiden): auf PyPy, gibt es keine Leistungsunterschiede, sondern auf CPython, können Sie erhalten × 2 Verbesserung zwischen a.A()
und a.b.c.d.e.f.g.h.A()
EDIT über die import ... as ...
Lösung, ist dies die Spur ich (ich glaube, es wird klarer als jede Erklärung ich geben konnte):
File "MyApp/__init__.py", line 3, in <module>
import MyApp.core
File "MyApp/core.py", line 3, in <module>
import MyApp.formatters.ASCIIFormatter as _F
File "MyApp/formatters/__init__.py", line 2, in <module>
import MyApp.formatters.ASCIIFormatter as ASCIIFormatter
File "MyApp/formatters/ASCIIFormatter.py", line 2, in <module>
import MyApp.core as _C
AttributeError: module 'MyApp' has no attribute 'core'
* "die beste Praxis in Python" * - würde ein Zitat benötigen. –
@PeterWood getan –
Das ist nicht beste Praxis, nur wie man mit kreisförmigen Importen arbeitet. Um zirkuläre Importe zu vermeiden, sollten Sie sie am besten vermeiden. Organisiere deine Abhängigkeiten richtig, reduziere Modulverantwortlichkeiten, benutze abstrakte über konkrete Typen, etc. –