捕获对memoryview()对象的__str__的调用

时间:2014-02-02 20:23:44

标签: python debugging python-2.7

我开始将一些代码从Python2.x移植到Python3.x,但在我进行跳转之前,我正在尝试将其现代化到最近的2.7。我在使用各种工具方面取得了很好的进展(例如,未来化),但他们独自留下的一个领域是使用buffer()。在Python3.x中,buffer()已被删除并替换为memoryview()In [1]: a = "abcdef" In [2]: b = buffer(a) In [3]: m = memoryview(a) In [4]: print b, m abcdef <memory at 0x101b600e8> 通常看起来更干净,但它不是1对1交换。

他们不同的一种方式是:

str(<buffer object>)

也就是说,repr()返回包含对象内容的字节字符串,而memoryviews返回其<memory at 0x1016c95a8>。我认为新行为更好,但它会导致问题。

特别是我有一些代码抛出异常,因为它接收到包含{{1}}的字节字符串。这表明在其他地方有一段代码依赖于这种行为,但我找不到它。

对于这类问题,有没有人有好的调试技巧?

1 个答案:

答案 0 :(得分:0)

一个可能的技巧是编写memoryview的子类并暂时将所有memoryview个实例更改为memoryview_debug个版本:

class memoryview_debug(memoryview):
    def __init__(self, string):
        memoryview.__init__(self, string)

    def __str__(self):
        # ... place a breakpoint, log the call, print stack trace, etc.
        return memoryview.__str__(self)

编辑:

如OP所述,显然不可能从memoryview继承。幸运的是,由于动态类型在Python中不是一个大问题,它将更加不方便。您可以将继承更改为合成:

class memoryview_debug:
    def __init__(self, string):
        self.innerMemoryView = memoryview(string)

    def tobytes(self):
        return self.innerMemoryView.tobytes()

    def tolist(self):
        return self.innerMemoryView.tolist()

    # some other methods if used by your code 
    # and if overridden in memoryview implementation (e.g. __len__?)

    def __str__(self):
        # ... place a breakpoint, log the call, print stack trace, etc.
        return self.innerMemoryview.__str__()