运行时生成带参数的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 个回答
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