2017-06-05 2 views
-1

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' 
+0

* "die beste Praxis in Python" * - würde ein Zitat benötigen. –

+0

@PeterWood getan –

+1

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. –

Antwort

0

Sie einen Aliasnamen festlegen können, wenn ein Modul importieren:

import a.b.c.d.e as E 

Der Code, den Sie auch geschrieben funktionieren würde, aber es ist nicht so schön:

import a.b.c.d.e 
E = a.b.c.d.e 
+0

Funktioniert nicht: wegen des zirkulären Importproblems hat 'a' noch kein Attribut' b' (oder eines der Submodule ...) –

+1

@ hl037_ Dann wie Machst du deine Importe? Ihre Frage fragt, wie man den teuren Namen Lookup vermeidet, erwähnt nichts über das Scheitern von Importen. –

+0

Angenommen, dass der gesamte Code zuerst in einem sehr großen "a" -Modul war, und es war eine Hölle, so dass es in Submodule aufgeteilt wurde. Einige Funktionen von 'abcdf' nennen Funktionen von 'a', und einige Funktionen von 'a' brauchen etwas in 'abcdf', also haben Sie in 'a' eine' import abcdf' und in 'abcdf' eine 'import a' –

Verwandte Themen