正在捕捉对memoryview()obj上的\uu str_uu的调用

2024-06-09 22:15:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始将一些代码从Python2.x移植到Python3.x,但是在我开始尝试将其更新到最新的2.7版本之前。我在使用各种工具(例如futurize)方面取得了很好的进展,但是它们没有涉及到buffer()的使用。在Python3.x中,buffer()被删除并被memoryview()取代,这看起来更干净,但它不是1对1的交换。在

它们的一个不同之处是:

In [1]: a = "abcdef"
In [2]: b = buffer(a)
In [3]: m = memoryview(a)
In [4]: print b, m
abcdef <memory at 0x101b600e8>

也就是说,str(<buffer object>)返回一个包含对象内容的字节字符串,而memoryviews返回它们的repr()。我认为新的行为比较好,但它引发了一些问题。在

特别是我有一些代码抛出了一个异常,因为它接收到一个包含<memory at 0x1016c95a8>的字节字符串。这表明在其他地方有一段代码依赖于这种行为来工作,但我很难找到它。在

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


Tags: 工具字符串代码in版本字节bufferat
1条回答
网友
1楼 · 发布于 2024-06-09 22:15:33

一个可能的技巧是编写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中不是一个大问题,它只会更加不方便。可以将继承更改为组合:

^{pr2}$

相关问题 更多 >