我进行了一些搜索,试图找出这个问题,但没有得到我正在寻找的解决方案。
这是我的用例:
这是我正在尝试做的一个简单示例:
def f1(a,b):
"""a==b"""
pass
def f2(f):
f_locals = "get f's args and values before f is executed"
return eval(f.__doc__,None,f_locals)
>>> f2(f1(2,2))
Run Code Online (Sandbox Code Playgroud)
虽然我不知道您为什么要这样做,但您所描述的内容可以通过该inspect模块来实现。这个例子与我能想到的最接近你原来的例子。
from inspect import getcallargs
def f1(a,b):
"""a==b"""
pass
def f2(f, *f_args, **f_kwargs):
f_callargs = getcallargs(f, *f_args, **f_kwargs)
return eval(f.__doc__, None, f_callargs)
f2(f1, 2, 2)
Run Code Online (Sandbox Code Playgroud)
这应该输出True.
请记住,这假设了有关传递给 的任何此类函数的参数和文档字符串的很多信息f2,其中最重要的是所检查的函数都不是恶意的或格式错误的。为什么不想正常调用函数,又为什么不想改变函数呢?
编辑:正如 Pajton 指出的那样,在这里更合适,并删除了对和getcallargs的调用。上面的代码已更新以反映这一点。dictzip