2009-07-29 8 views
2

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') 

Répondre

4

La réponse vous est venue est une solution valable.

Cependant, si vous étiez si inquiet au sujet des dépendances circulaires, je dirais que log_exec_time appartiendrait à son propre fichier puisqu'il ne dépendait d'aucune autre chose dans tuti.py.

+3

La meilleure solution consiste à déplacer le décorateur vers un autre module et à éviter une dépendance circulaire. – codeape

+0

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

+0

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

Questions connexes