j'avais eu un cas suivant l'importation circulaire (ici severly simplifiée):Python: Comment se débarrasser de la dépendance circulaire impliquant décorateur?
array2image.py
module de conversion:
import tuti
@tuti.log_exec_time # can't do that, evaluated at definition time
def convert(arr):
'''Convert array to image.'''
return image.fromarray(arr)
tuti.py
module de test:
import array2image
def log_exec_time(f):
'''A small decorator not using array2image'''
def debug_image(arr):
image = array2image.convert(arr)
image = write('somewhere')
Il a échoué avec NameError. Cela ne me semblait pas juste, car il n'y avait pas vraiment de dépendance circulaire là-bas. Je cherchais un soignée façon d'éviter cela ou une explication ... et à mi-chemin à travers l'écriture de cette question je l'ai trouvé.
Déplacement du import
en dessous du décorateur tuti.py
résout NameError:
def log_exec_time(f):
'''A small decorator not using array2image'''
import array2image
def debug_image(arr):
image = array2image.convert(arr)
image = write('somewhere')
La meilleure solution consiste à déplacer le décorateur vers un autre module et à éviter une dépendance circulaire. – codeape
Oui, c'est BEAUCOUP mieux d'éviter complètement la dépendance circulaire, que d'essayer de la contourner avec des solutions fragiles comme celle-ci. –
C'était une solution de contournement évidente et une raison, pourquoi j'ai demandé du tout. Je suis plus content de ma solution, car cela créerait un module pour contenir 4 lignes de code et c'est tellement Java:) ... et ça ne cadrerait pas avec la couleur de ma licence ... Nah ... Ausschwitz! – dhill