3

'Logger' adında bir statik varlıkla JCheq sınıfına sahibim.Bu Python içe aktarma dairesel referansı nasıl çözülür

JCheq, printing_systems modülünü alır, ancak printing_systems'dan JCheq.logger kullanmam gerekir. Ben printing_systems.py yılında import JCheq koyduktan sonra

Kodum derleme yapmaz.

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) 

hata iz:

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

Artık referansları döngüsel hale getirme (print_systems, örn., Decompose). Ya da "aldatma" yapabilir ve almayı global kapsamdan dışarıya taşıyabilirsiniz. –

+0

um ... print_systems modülünde 'print_systems' adlı bir değişken var mı? Sadece 'import printing_systems' yerine –

+0

@BrianCain modülünden bir değişken ithal etmeye çalışıyorsunuz. Evet, ithalatı yöntemlere taşıdım ve şimdi çalışıyor, ancak bunun kabul edilebilir olup olmadığını bilmiyorum ... ne demek istiyorsun ayrıştırma ile? – JorgeeFG

cevap

1

fonksiyonunda alma deyimi hareket genel olarak dairesel bir ithalat çözmek için kullanılır . Uygulamanızın yeniden yapılandırılmasının çok masraflı olduğu durumlarda (işe yararsa) çok kullanışlıdır.

Başka bir çözüm de, jcheq.py ve printing_systems/printing_systems.py öğelerinin içe aktardığı kendi modülüne JCheq.logger öğesini taşımak olacaktır.

Veya, (ya da sadece o memoize) bazı kayıt destekli bir fabrika fonksiyonunu logger.Logger yapabilir aynı argümanlar verildiğinde aynı logger döndürmesini sağlayacak şekilde. Bu şekilde, printing_system.py, jcheq'u içe aktarmak yerine logger'u içe aktarır.

+0

Eh, fabrika yaklaşımı seçti, iş gibi görünüyor. Onunla karşılaştığım bir problem, ithalat baskı sistemlerinin JCheq'in üstünde olmasından dolayı, ilk önce LoggerFactory'yi ithal etmem ve daha sonra logger'ın global bir varyasyon olması, ardından print_systems'i alması gerektiğidir. Else printing_systems ilk işlenecek ve aynı yolda ancak farklı log_level ile kaydedicisi oluşturulacaktır (log_level yalnızca bir kez ayarlanması gerekir çünkü ve isteğe bağlı bir argümandır) 'logger.Logger' memoizing – JorgeeFG

+0

sen denediniz mi? Python 3'ü kullanıyorsunuz, bunu 'functools.lru_cache' kullanarak hızlıca yapabilirsiniz. İthalat siparişi sorununu çözeceğini düşünüyorum. – daragua