Skip to main content
 首页 » 编程设计

Python:如何摆脱涉及装饰器的循环依赖

2024年08月12日30daizhj

我得到了以下循环导入的案例(这里大大简化了):

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 而失败。这对我来说看起来不对,因为那里真的没有循环依赖。我一直在寻找避免这种情况的简洁方法或解释...在写这个问题的过程中我找到了它。

将 import 移动到 tuti.py 中的装饰器下方可解决 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') 

请您参考如下方法:

您得出的答案是有效的解决方案。

但是,如果您担心循环依赖,我会说 log_exec_time 应该属于它自己的文件,因为它不依赖于 tuti.py 中的任何其他内容。