让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
级别有条件地导入它,这就成功了!伟大的我认为,为了所有人的利益,我们应该制定一个答案