Python: 如何解决涉及装饰器的循环依赖?

3 投票
1 回答
2465 浏览
提问于 2025-04-15 13:14

我遇到了一个循环导入的问题(这里简化了很多):

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里的其他内容。

撰写回答