有没有一种有效的方法来调试Python中的副作用?
例如,list(或任何不同的可变对象)作为参数传递给函数。
>>> some_list = [1,2]
>>> some_function_with_huge_call_tree(some_list)
>>> print some_list
[2,1]
现在如何确定程序在程序中的位置已被颠倒?
还有一个例子,类实例作为参数传递:
>>> print obj.x
foo
>>> some_function_with_super_huge_call_tree(obj)
>>> print obj.x
bar
如果类实例的成员已被更改?
在这两种情况下我都想要这样的东西:
pdb.break_on_change(some_list) # case 1
pdb.break_on_change(obj.x) # case 2
不幸的是,PDB没有这样的功能。
换句话说,我试图为所有案例找到一个共同的解决方案。
答案 0 :(得分:0)
你可以放入一个模拟对象,告诉你它做了什么。
这是一个(太)最小的例子,用于追踪调用变异函数属性的位置。
def throw(*args, **kwargs):
raise AssertionError()
class Mock(object):
def __init__(self, inner):
self.__inner = inner
def __getattr__(self, name):
if name == 'mutate':
return throw
return getattr(self.__inner, name)
然后在
中使用它some_function(Mock(obj))
了解some_function
是否正在改变obj
。
此示例缺少您可以从模拟基础架构中获得的许多功能。可能最糟糕的是,它并不支持魔法。也许你可以扩展它以满足你的需求。实际上,如果没有一个库可以做到这一点,我会感到惊讶。