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

1 投票
1 回答
614 浏览
提问于 2025-04-16 04:21

假设,我有一个这样的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 个回答

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

撰写回答