调用修饰的外部函数

2024-09-28 16:52:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法,让脚本执行一些我不知道名称的函数,并在另一个模块上定义(假定由另一个用户提供),但用我定义的函数装饰。在

例如,外部脚本将是:

    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"

反过来,我将在我的应用程序中导入它并执行函数(我不知道它们的名称),并能够使用修饰函数返回的内容。在

我之所以想到装潢师是成为烧瓶似乎暴露了类似的行为: 用户可以通过用$@app.route(my/route)装饰函数来定义新路由。然后在路由上执行http调用时执行此函数,应用程序可以使用函数返回的任何内容(json)将其返回给用户。在

然而,行为似乎不符合装饰师的实际定义,我不知道如何才能做到这一点。我是在这里遗漏了什么,还是有一个只使用装饰器的解决方案?在


Tags: 函数用户脚本名称return定义foodef
2条回答

看起来你想创建某种函数注册表。下面是一个简单的示例实现,它使用字典跟踪已注册的函数。在

class Tracker(dict):
    def register(self, identifier):
        def wrapper(function):
            self[identifier] = function
            return function
        return wrapper


tracker = Tracker()

@tracker.register('A')
def function_A():
    print('Blah')

tracker['A']() # Blah

如果要注册已定义的函数,可以使用:

^{pr2}$

您只需要从包装器中存储传入函数的副本。您可以将函数引用存储在全局名称中,listdict或您选择的任何其他方式。在

{{{cd2>在这里存储了一个

funcs = { }

def preprocess(*args):
    def wrapper(fn):
        funcs['preprocess'] = fn
        return fn
    return wrapper

def process(*args):
    def wrapper(fn):
        funcs['process'] = fn
        return fn
    return wrapper

def postprocess(*args):
    def wrapper(fn):
        funcs['process'] = fn
        return fn
    return wrapper

完成所有初始化后,可以调用以下函数:

^{pr2}$

相关问题 更多 >