让python查找并评估代码库中的所有修饰函数

让python查找并评估代码库中的所有修饰函数,python,django,Python,Django,我试图在我的代码库中使用可由唯一标识符调用的函数,为此我创建了一个注册函数的装饰器 global FUNCTION_REGISTRY FUNCTION_REGISTRY = {} class FunctionAlreadyRegistered(Exception): pass def register_function(function_identifier, function): global FUNCTION_REGISTRY if function_ident

我试图在我的代码库中使用可由唯一标识符调用的函数,为此我创建了一个注册函数的装饰器

global FUNCTION_REGISTRY
FUNCTION_REGISTRY = {}

class FunctionAlreadyRegistered(Exception):
    pass

def register_function(function_identifier, function):
    global FUNCTION_REGISTRY

    if function_identifier not in FUNCTION_REGISTRY:
        FUNCTION_REGISTRY[function_identifier] = function
    else:
        raise FunctionAlreadyRegistered

def call_registered_function(function_identifier, *args, **kwargs):
    global FUNCTION_REGISTRY
    if function_identifier in FUNCTION_REGISTRY:
        FUNCTION_REGISTRY[function_identifier](*args, **kwargs)

class EventHandler(object):
    def __init__(self, identifier):
        self.identifier = identifier

    def __call__(self, original_func):
        decorator_self = self

        def wrappee(*args, **kwargs):
            original_func(*args, **kwargs)

        print "REGISTER FUNCTION", decorator_self.identifier
        register_function(decorator_self.identifier, wrappee)
        return wrappee
然后我像这样使用这个装饰器

@EventHandler(identifier="something.task-created-handler")
def task_created_event_handler(pk=None, *args, **kwargs):
   pass
这使我能够轻松地完成以下工作

call_registered_function("something.task-created-handler",argument="value")
然而,只有当其他文件有意导入此文件时,才会计算此装饰器,我希望通过我的代码库计算所有此装饰器,以注册所有已识别的函数


当运行时以无缝方式启动时,有没有办法让python评估所有这些装饰器?

类似于导入
\uuu init\uuuuuuuuuupy.py中的所有模块,以便评估所有内容?否则,我不太明白你怎么能做到这一点。模块(无论其中是否有函数、装饰器或类)仅在导入模块时进行求值。@nir0s如果我这样做,这将导致django抛出此异常
raise AppRegistryNotReady(“应用程序尚未加载”)django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。
这可能是因为您只能在特定条件下导入某些内容。我不是说你可以。我是说,如果你可以,那将是一种方法。如果有需要上下文的模块,不运行代码就无法对其进行评估。python就是这样工作的。@nir0s我最后做的事情与您的解决方案非常接近,使用
\uuuu init\uuuu
文件,但在django上使用带有自定义配置的
ready
方法在
app
级别有条件地导入它,这就成功了!伟大的我认为,为了所有人的利益,我们应该制定一个答案