使用numpy.bytes_对象进行字符串格式化时超出最大递归深度

3 投票
1 回答
1347 浏览
提问于 2025-04-17 19:26

这段代码应该能自我说明:

$ python
Python 3.3.0 (default, Dec 22 2012, 21:02:07) 
[GCC 4.7.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> '{}'.format(np.bytes_(b'Hello'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: maximum recursion depth exceeded while calling a Python object
>>> np.version.version
'1.7.0'

在使用 np.bytes_(b'Hello') 时,strrepr 都会返回 "b'Hello'",而且我可以正常使用 print(np.bytes_(b'Hello')) 来打印出来,但在格式化字符串中却出现了递归循环的问题。

我是不是太傻了,还是说这确实是 numpy 的一个问题?即使真的是这样,我也不太明白到底发生了什么。有人能帮我解释一下吗?

我在 Python 2 中没有复现这个问题。

1 个回答

2

{}的行为是调用np.bytes_(b'Hello').__format__()。看起来这里有个bug,导致__format__方法在调用自己。你可以查看这个相关的问题

这里有一个解决方法。

Python 3.2.3 (default, Oct 19 2012, 19:53:57) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> '{}'.format(np.bytes_(b'Hello'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: maximum recursion depth exceeded while calling a Python object
>>> '{!s}'.format(np.bytes_(b'Hello'))
"b'Hello'"
>>> '{!r}'.format(np.bytes_(b'Hello'))
"b'Hello'"

撰写回答