python - 在Python中运行时获取局部变量的名称

标签 python debugging

我应该先说以下几点:我知道默认情况下不支持此功能 - 我正在尝试的是一种黑客解决方法,几乎​​没有实际应用,并且是一种完整的精神自慰实践,因为无聊和好奇。也就是说,我正在尝试执行以下操作:

基于以下 Python 代码,

with BuildFile('mybuild.build') as buildfile:
    objdir = 'obj'

我想生成一个文件,mybuild.build内容如下:

objdir = obj

理想情况下,我想在创建时关联变量名称,这样如果我要在 objdir = 'obj' 之后设置断点,我希望能够执行以下操作:

>>> print repr(objdir)
'objdir = obj'

但是,使用内置功能这是不可能的,因为无法覆盖从语法推断的类型。我最终可能会在 BuildFile.__enter__ 中找到一个解决方法。使用 ctypes 的方法猴子补丁tp_newtp_dict底层字段PyTypeObject struct(并随后在退出时恢复该覆盖),但为了简单起见,我们假设在到达 BuildFile.__exit__ 之前我不会关联变量名称。方法。

我想知道的是:

是否有内置的 Python 功能用于停止执行、追溯到声明局部变量的帧以及获取与变量关联的局部名称?

最佳答案

实际上你可以执行类似的技巧,如下所示:

>>> from contextlib import contextmanager
>>> @contextmanager
def override_new_vars(locs):
    old_locals = locs.copy()
    yield
    new_locals_names = set(locs) - set(old_locals)
    for name in new_locals_names:
        locs[name] = '%s = %r' % (name, locs[name])


>>> with override_new_vars(locals()):
    c = 10


>>> c
'c = 10'

在你的情况下,它看起来像:

with BuildFile('mybuild.build') as buildfile, override_new_vars(locals()):
    objdir = 'obj'

这就是你想做的吗?

关于python - 在Python中运行时获取局部变量的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583505/

相关文章:

iphone - iPhone 应用程序要保留什么?

python - 对来自两个数据帧的分组数据使用 isin() 函数

python - 当前时间在范围内

python - 在 Python 中使用冒号对列表进行切片时,是否可以使用大于列表长度的停止大小?

php - PHP解析/语法错误;以及如何解决它们

javascript - 如何通过压缩的 JavaScript 文件进行调试?

python - 在 PySpark 中提取特定行

python - 如何将旧版本Python的旧库移动到新版本Python

debugging - gdb + nasm调试信息未创建

c++ - 使用 Visual 调试器释放内存非常慢