免责声明:我对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调用函数)
听起来你想要的是^{} 装饰器。它与您的
Foo
函数的功能完全相同,只是以更一般的方式。在根据您的评论,您还可以使用一个类来做您想做的事情,这可能是一个有点像Python的类:
实际上,经过进一步的思考,最具python风格的方法是创建一个类,该类表示您的配置,其中包含您需要的所有方法。比如:
^{pr2}$您可以将这些方法作为可调用项传递:
相关问题 更多 >
编程相关推荐