如何在Python中有效地调试副作用?

时间:2014-10-01 16:32:28

标签: python debugging side-effects

有没有一种有效的方法来调试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没有这样的功能。

换句话说,我试图为所有案例找到一个共同的解决方案。

1 个答案:

答案 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

此示例缺少您可以从模拟基础架构中获得的许多功能。可能最糟糕的是,它并不支持魔法。也许你可以扩展它以满足你的需求。实际上,如果没有一个库可以做到这一点,我会感到惊讶。