3

Ich habe eine Klasse JCheq, mit einer statischen var namens "Logger".So lösen Sie diese Python-Import-Zirkelreferenz

JCheq importiert Modul printing_systems, aber ich muss JCheq.logger von printing_systems verwenden.

Mein Code kompiliert nicht, nachdem ich import JCheq in printing_systems.py gesetzt habe.

jcheq.py

from printing_systems import printing_systems 
from logger import logger 

class JCheq: 
    logger = logger.Logger('logs/jcheq.log', loglevel=logger.Logger.INFO) 

    def __init__(self): 
     pass 
    ... 

printing_systems/printing_systems.py

from jcheq import JCheq 
class WinLPR: 

    def __init__(self): 
     pass 

    @staticmethod 
    def send(spool, params): 
     temp_dir = tempfile.mkdtemp() 
     try: 
      JCheq.logger.log('Creando archivo temporal en dir: ' + temp_dir, logger.Logger.TRACE) 

Fehler-Trace:

Traceback (most recent call last): 
    File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/jcheq.py", line 12, in <module> 
    from printing_systems import printing_systems 
    File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/printing_systems/printing_systems.py", line 7, in <module> 
    from jcheq import JCheq 
    File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/jcheq.py", line 12, in <module> 
    from printing_systems import printing_systems 
ImportError: cannot import name 'printing_systems' 
+0

Machen Sie die Referenzen nicht mehr zirkulär (z. B. "printing_systems" zerlegen). Oder Sie können "schummeln" und den Import aus dem globalen Bereich in den Bereich verschieben, in dem er verwendet wird. –

+0

um ... gibt es eine Variable namens 'printing_systems' im' printing_systems' Modul? Sie versuchen, eine Variable aus dem Modul zu importieren, anstatt nur "import printing_systems" –

+0

@BrianCain Ja habe ich den Import auf die Methoden verschoben und jetzt funktioniert es, aber ich weiß nicht, ob das akzeptabel ist ... was meinst du mit der Zersetzung? – JorgeeFG

Antwort

1

die Import-Anweisung in der Funktion Verschieben wird häufig verwendet, Kreis Importe zu lösen . Es ist praktisch in Fällen, in denen die Umstrukturierung Ihrer Anwendung zu teuer wäre (wenn überhaupt nützlich). Eine andere Lösung wäre, JCheq.logger in ein eigenes Modul zu verschieben, das sowohl jcheq.py als auch printing_systems/printing_systems.py importieren würde.

Oder Sie könnten Logger.Logger eine Factory-Funktion durch eine Registry gesichert (oder einfach memoize), so dass es den gleichen Logger zurückgibt, wenn die gleichen Argumente gegeben sind. Auf diese Weise würde einfach importieren logger statt jcheq importieren.

+0

Nun, ich entschied mich für den Factory-Ansatz, scheint zu funktionieren. Ein Problem, das ich damit gefunden habe, ist, dass, da der Import von printing_systems auf JCheq steht, ich zuerst LoggerFactory importieren muss und dann logger eine globale Variable direkt danach sein muss, dann printing_systems importieren. Else printing_systems wird zuerst geparst und ein Logger mit dem gleichen Pfad aber einem anderen log_level wird erstellt (da log_level nur einmal gesetzt werden sollte und es sich um ein optionales Argument handelt) – JorgeeFG

+0

Haben Sie versucht, 'logger.Logger' zu memoisieren? Wenn Sie Python 3 verwenden, können Sie dies schnell mit 'functools.lru_cache' machen. Ich denke, es würde das Importauftrags-Problem lösen. – daragua

Verwandte Themen