是否可以在运行时生成带参数的Python函数?

时间:2010-09-20 11:33:45

标签: python

说,

我有一个python函数如下:

def ooxx(**kwargs):
    doSomething()
    for something in cool:
        yield something

我想提供另一个带有提示的命名参数的函数,如下所示:

def asdf(arg1, arg2, arg3=1):
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    kwargs = dict((key, values[key]) for key in args) # convert args list into dictionary form
    return list(ooxx(**kwargs))

是否可以使用某种方法自动生成“asdf”功能?我有很多动态生成的ooxx函数,我希望有相应的asdf函数和自定义的命名参数。不确定这是正确的要求还是正确的编码方式:p

1 个答案:

答案 0 :(得分:4)

你的描述对我来说没有意义:你写了一个非常冗长的函数来做到这一点:

def asdf(arg1, arg2, arg3=1):
    return list(ooxx(**locals()))

但你想检查ooxx并以某种方式为asdf的参数组成适当的名字?这是不可能的,ooxx上没有关于此的信息。

如果您实际拥有签名并希望从中创建一个函数,则必须求助于eval或生成Python文件的函数定义并导入它。

还有decorator模块。您可以使用它创建一个函数:

import decorator
asdf = decorator.FunctionMaker.create(
                'asdf(arg1, arg2, arg3)', # signature
                'return ooxx(**locals())', # function body
                {'ooxx' : ooxx}, # context for the function
                ('arg3', 1)) # default arguments