我应该先说以下几点:我知道默认情况下不支持此功能 - 我正在尝试的是一种黑客解决方法,几乎没有实际应用,并且是一种完整的精神自慰实践,因为无聊和好奇。也就是说,我正在尝试执行以下操作:
基于以下 Python 代码,
with BuildFile('mybuild.build') as buildfile:
objdir = 'obj'
我想生成一个文件,mybuild.build
内容如下:
objdir = obj
理想情况下,我想在创建时关联变量名称,这样如果我要在 objdir = 'obj'
之后设置断点,我希望能够执行以下操作:
>>> print repr(objdir)
'objdir = obj'
但是,使用内置功能这是不可能的,因为无法覆盖从语法推断的类型。我最终可能会在 BuildFile.__enter__
中找到一个解决方法。使用 ctypes
的方法猴子补丁tp_new
或tp_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/