如何在python中打破循环导入

时间:2012-10-16 14:41:35

标签: python celery circular-dependency

我的python代码中存在循环导入问题。一个模块的装饰器需要在另一个模块中调用一个函数。此函数使用从前一个模块导入的装饰器。显示的错误消息无法导入名称xxxx

我的代码结构:

__init__.py
worker1.py
worker2.py
...

并且 init .py

中有一个装饰器
def defer():
    def wrapper(func):
        def wrapper_f(*args, **kargs):
            some logic here...
            new_func = eval("%s.apply_async" % func.func_name) # I use celery to do async call here
            new_func(args = args, kwargs = kargs)
        wrapper_f.__name__ = func.func_name # This is to allow celery to load different task based on function name
        return wrapper_f
    return wrapper

在worker1.py

@celery.task
@defer
def task1(*args, **kargs):
    some logic

它将在__init__.py和worker1.py中进行循环导入,因为 eval(“%s.apply_async”%func.func_name)需要在worker1中加载函数,而worker1需要加载__init__中的装饰器。如何解决这个循环导入问题?

顺便说一句,我无法将装饰器功能移动到worker1.py,bcz是同一文件夹中的其他工作人员所需要的。

0 个答案:

没有答案