我正在使用带有ipdb的交互式图形Python调试器(Canopy的图形化调试器).我正在处理的脚本有多个导入的模块和几个调用它们各自的功能.每当我尝试调试运行时,执行就会在对导入模块的函数(特别是子进程)的调用中卡住.我的两个主要问题是:
1)在调试模式下运行会大大减慢速度吗?代码实际上是不是卡住了,而只是以一种非常缓慢的速度运行?
2)有没有办法完全传递代码并运行它们就好像我甚至没有调试一样?我想阻止调试器进入子进程,只是执行它就像正常运行一样.
我可能会抛弃图形化调试器,并从终端做所有事情,但我想避免这种情况,因为图形界面非常方便,节省了很多打字.
问题:如何拦截__getitem__对对象属性的调用?
解释:
所以,场景如下。我有一个对象将类似 dict 的对象存储为属性。每次__getitem__调用此属性的方法时,我都想拦截该调用并根据键对获取的项目进行一些特殊处理。我想要的看起来像这样:
class Test:
def __init__(self):
self._d = {'a': 1, 'b': 2}
@property
def d(self, key):
val = self._d[key]
if key == 'a':
val += 2
return val
t = Test()
assert(t.d['a'] == 3) # Should not throw AssertionError
Run Code Online (Sandbox Code Playgroud)
问题是 @property 方法实际上无法访问__getitem__调用中的密钥,所以我根本无法检查它来执行我的特殊后处理步骤。
重要说明:我不能只是对 MutableMapping 进行子类化,覆盖__getitem__我子类的方法来执行此特殊处理,并将子类的实例存储在self._d. 在我的实际代码self._d中已经是 MutableMapping 的子类,这个子类的其他客户端需要访问未修改的数据。
感谢您的任何帮助!