我开始将一些代码从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}}的字节字符串。这表明在其他地方有一段代码依赖于这种行为,但我找不到它。
对于这类问题,有没有人有好的调试技巧?
答案 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__()