gpt4 book ai didi

python - 执行后如何获取函数局部变量的值?

转载 作者:太空狗 更新时间:2023-10-29 21:38:19 24 4
gpt4 key购买 nike

假设我有一个类似f(a, b, c=None) 的函数。目的是像 f(*args, **kwargs) 那样调用函数,然后构造一组新的 args 和 kwargs,这样:

  1. 如果函数有默认值,我应该能够获取它们的值。例如,如果我将它称为 f(1, 2),我应该能够得到元组 (1, 2, None) 和/或字典 {'c': None}.
  2. 如果在函数内部修改了任何参数的值,则获取新值。例如,如果我像 f(1, 100000, 3) 这样调用它并且函数执行 if b > 500: b = 5 修改局部变量,我应该是能够得到元组 (1, 5, 3)

这里的目的是创建一个装饰器来完成函数的工作。原始函数充当序言,为实际执行设置数据,装饰器完成工作。

编辑:我正在添加一个我正在尝试做的例子。这是一个为其他类制作代理的模块。


class Spam(object):
"""A fictional class that we'll make a proxy for"""
def eggs(self, start, stop, step):
"""A fictional method"""
return range(start, stop, step)<p></p>

<p>class ProxyForSpam(clsproxy.Proxy):
proxy_for = Spam
@clsproxy.signature_preamble
def eggs(self, start, stop, step=1):
start = max(0, start)
stop = min(100, stop)</p>

<p></p>

然后,我们将拥有:

ProxyForSpam().eggs(-10, 200) -> Spam().eggs(0, 100, 1)

ProxyForSpam().eggs(3, 4) -> Spam().eggs(3, 4, 1)

最佳答案

有两种食谱可用here ,一个需要外部库,另一个只使用标准库。它们不会完全做你想做的事,因为它们实际上修改了正在执行的函数以获得它的 locals() 而不是获得 locals() 在函数执行后,这是不可能的,因为函数执行完成后本地堆栈不再存在。

另一种选择是查看调试器,例如WinPDB甚至 pdb 模块也可以。我怀疑他们使用 inspect 模块(可能与其他模块一起)来获取正在执行函数的框架并以这种方式检索 locals()

编辑: 在阅读了标准库中的一些代码之后,您想要查看的文件可能是 bdb.py,它应该位于您的 Python 其余部分的任何位置标准库是。具体看set_trace()及相关函数。这将使您了解 Python 调试器如何中断类。您甚至可以直接使用它。要获取要传递给 set_trace() 的帧,请查看 inspect 模块。

关于python - 执行后如何获取函数局部变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4214936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com