【发布时间】:2018-01-11 11:46:36
【问题描述】:
我正在寻找一种方法让脚本执行一些我不知道名称并在另一个模块上定义的函数(假设由另一个用户提供),但用我定义的函数进行修饰。
例如,外部脚本是:
from MyScript import preprocess, process, postprocess
@preprocess(foo, bar)
def external_provider_random_name():
return "foo"
@process(foobar)
def external_provider_random():
return "bar"
@postprocess(foo, bar)
def external_provider():
return "foobar"
然后我会在我的应用程序中导入它并执行函数(我不知道它们的名字),并能够使用修饰函数返回的内容。
我想到装饰器的原因是成为flask似乎暴露了类似的行为:
用户可以通过使用$@app.route(my/route) 装饰函数来定义新路由。然后在路由上执行 http 调用时执行此函数,并且应用程序可以使用该函数返回的任何内容(一个 json)将其返回给用户。
但是,这种行为似乎与装饰器的实际定义不符,我不知道如何实现这一点。我在这里遗漏了什么还是只使用装饰器的解决方案?
【问题讨论】:
-
请注意,在函数后添加
function = decorator(function)等同于在函数前添加@decorator。 -
这就是我可以围绕函数调用添加操作的方式。但是我仍然不知道如何首先调用该函数,因为我无权访问它的名称。
-
你不需要函数名来调用它。您只需要对该函数的引用,这正是传递给您的装饰器的内容。
-
基本上你的装饰器必须将函数存储在某个地方的注册表中。没有魔法设施装饰器可以做到这一点;您只需要自己编写一个装饰器,它会执行类似
my_registry.append(func)的操作(其中my_registry是您创建的一些函数列表,func是被装饰的函数)。 -
从根本上说,flask
app对象不仅仅是一个装饰功能,它是一个巨大的类。app.route方法 是实际的装饰器,它基本上是adds the function you are calling to a registry。