2009-07-29 10 views
2

私は、円形のインポート(ここでは重度簡体字)の次のケースを持っていた:Python:デコレータを含む循環依存関係を取り除くにはどうすればいいですか?

array2image.py変換モジュール:

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テストutilsのモジュール:

import array2image 

def log_exec_time(f): 
    '''A small decorator not using array2image''' 

def debug_image(arr): 
    image = array2image.convert(arr) 
    image = write('somewhere') 

それはNameErrorで失敗しました。実際にそこに循環的な依存がなかったので、これは私には見えませんでした。私はニース方法またはその説明を避けるための方法を探していた...と私はそれを見つけたこの質問を書いて半分。 tuti.pyにデコレータ以下importを移動

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

答えて

4

答えは有効なソリューションです。

しかし、循環依存性が心配ならば、log_exec_timeはtuti.pyのそれ以外のものに依存しないので、独自のファイルに属すると言います。

+3

最適な解決策は、デコレータを別のモジュールに移動し、循環依存性を避けることです。 – codeape

+0

まあ、このような壊れやすい解決策でそれをスカートしようとするよりも、循環依存を完全に避けるほうがずっと良いです。 –

+0

これは明白な回避策であり、理由、なぜ私はすべて尋ねた。私は私のソリューションにもっと満足しています。これは、コードライン機能を4行保有するモジュールを作成することになります。それはJavaです:)...そして、ライセンスの色に合わない... Nah ...アウシュヴィッツ! – dhill

関連する問題