Python è un linguaggio estremamente elegante. Bene, tranne ... eccetto le importazioni. Non riesco ancora a farlo funzionare come mi sembra naturale.Importazioni circolari inferno
Ho una classe MyObjectA
che si trova nel file mypackage/myobjecta.py
. Questo oggetto utilizza alcune funzioni di utilità che si trovano in mypackage/utils.py
. Così nelle mie prime righe di myobjecta.py
scrivo:
from mypackage.utils import util_func1, util_func2
Ma alcune delle funzioni di utilità creare e restituire nuove istanze di MyObjectA
. Quindi ho bisogno di scrivere in utils.py
:
from mypackage.myobjecta import MyObjectA
Beh, no non posso. Questa è un'importazione circolare e Python si rifiuterà di farlo.
Ci sono molte domande riguardo questo problema, ma nessuna sembra dare una risposta soddisfacente. Da quello che posso leggere in tutte le risposte:
- Riorganizzare i moduli, lo stai facendo male! Ma non so come meglio organizzare i miei moduli anche in un caso così semplice come ho presentato .
- provare solo
import ...
piuttosto chefrom ... import ...
(personalmente io odio di scrivere e potenzialmente refactoring tutti i pieni qualificazioni nome, mi piace vedere esattamente di cosa sto importazione in modulo dal mondo esterno). Questo sarebbe d'aiuto? Non sono sicuro, ancora ci sono le importazioni circolari. - Gli hacker come importano qualcosa nello scope interno di un corpo di una funzione solo una riga prima di utilizzare qualcosa da un altro modulo.
Sto ancora sperando che ci sia la soluzione numero 4) che sarebbe Pythonic nel senso di essere funzionale ed elegante, semplice e funzionante. O non c'è?
Nota: Io sono principalmente un programmatore C++, l'esempio sopra è così facilmente risolvibile includendo intestazioni corrispondenti che non posso credere che non sia possibile in Python.
Da quello che dici, ho messo MyObjectA in utils.py perché alcune funzioni di utilità lo restituiscono, oppure inserisco le funzioni di utilità che restituiscono MyObjectA in myobjecta.py. Ma questa è la risposta 1) – DainDwarf
Ho cercato le importazioni circolari di python e ho trovato diverse domande. Hai cercato? –
@ Dain: Sì, certamente potrebbe farlo se le funzioni di utilità restituiscono solo MyObjectA. Ma cosa succede se possono anche restituire MyObjectB o MyObjectC ecc. –