如何从函数外部获取函数参数和值?

mst*_*ath 5 python

我进行了一些搜索,试图找出这个问题,但没有得到我正在寻找的解决方案。

这是我的用例:

  • 我想根据 f/m 的参数和值来评估函数/方法文档字符串中的表达式,但是从函数外部(当被调用但在函数执行外部时)
  • 我无法静态更改我正在评估的源代码(无法编写新功能),但动态更改(即包装函数或在运行时添加属性)是可以接受的
  • 我更愿意坚持使用标准库中的工具,但如果它能让任务变得轻而易举,我愿意尝试外部库

这是我正在尝试做的一个简单示例:

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)

mul*_*ces 5

虽然我不知道您为什么要这样做,但您所描述的内容可以通过该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