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
是一个测试工具模块:
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
移到装饰器(decorator)下面,就解决了名称错误:
def log_exec_time(f):
'''A small decorator not using array2image'''
import array2image
def debug_image(arr):
image = array2image.convert(arr)
image = write('somewhere')
1 个回答
5
你想到的这个答案是个不错的解决办法。
不过,如果你真的很担心循环依赖的问题,我建议把log_exec_time放到一个单独的文件里,因为它并不依赖于tuti.py里的其他内容。