Python:延迟函数的装饰器

2024-06-12 16:50:22 发布

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

免责声明:我对python相当陌生(2个月)

我有一个脚本,它必须自动生成大量的测试,在执行它的工作之前,它需要从配置文件中解析一些数据。问题是,这些数据中的一些只有在所有配置都被读取、解析和处理之后才能知道。我目前的解决方案是在一个文件中使用以下形式的函数:

def Foo (arg1, arg2, ..., argn) :
    return lambda **kwargs : Foo_helper(arg1, arg2, ..., argn, refs = kwargs["refs"], vars = kwargs["vars"])

def Foo_helper(arg1, arg2, ..., argn, **kwargs) :
    ... some function statements ...

因为脚本不知道它在调用什么函数,所以我用arg1到n启动。这是可行的,但我不喜欢定义2个函数才能调用1。我想要的是:

^{pr2}$

但我目前的尝试是:

def arg_deferred(fns) :
    def newFn(*args, **kwargs) :
        fn(*args, **kwargs)
    return lambda **kwargs : newFn(*args, kw1 = kwargs["vars"], kw2 = kwargs["refs"], ..., kwn = kwargs["kwn"])

让我。。。在

return lambda *args, **kwargs : newFn(*args, refs = kwargs["refs"], vars = kwargs["vars"]) 
KeyError: 'refs'

这就发生在我称之为Foo的地方。我不明白为什么会发生这种情况,因为在我调用Foo的时候,我只希望得到一个lambda,稍后调用它时,它将调用newFn,而不是立即调用newFn。我是否在做一些对更有经验的python用户来说显而易见的事情,有没有更好的方法来获得我想要的东西?(我尝试过屈服而不是返回,但也没有找到一种方法来实现这一点,我曾经尝试过functools的部分功能,但我发现自己用空kwargs调用函数)


Tags: 数据lambda函数脚本returnfoodefargs
1条回答
网友
1楼 · 发布于 2024-06-12 16:50:22

听起来你想要的是^{}装饰器。它与您的Foo函数的功能完全相同,只是以更一般的方式。在

根据您的评论,您还可以使用一个类来做您想做的事情,这可能是一个有点像Python的类:

class FooHelper(object):
    def __init__(self, arg1, arg2, ..., argn):
        self.arg1 = arg1
        self.arg2 = arg2
        ...
        self.argn = argn

    def __call__(self, **kwargs):
        # ... some function statements ...

foo_helper_inst = FooHelper(conf_arg1, conf_arg2, ..., conf_argn)
foo_helper_inst(refs = 10, vars = 2)

实际上,经过进一步的思考,最具python风格的方法是创建一个类,该类表示您的配置,其中包含您需要的所有方法。比如:

^{pr2}$

您可以将这些方法作为可调用项传递:

def do_something(foo_func):
    foo_func(refs=10, vars=2)

do_something(a.foo_helper)

相关问题 更多 >