我正在为一个非常奇怪的numpy导入问题寻找解释(理想情况下也是一种解决方法)。这是一个最小的代码示例:可以重现python3.3和python3.2,numpy-v1.8.0和今天来自github的numpy快照。
from warnings import warn
warn(b"please be careful!")
输出:
test.py:2: UserWarning: b'please be careful!'
warn(b"please be careful!")
现在使用numpy导入:
from warnings import warn
import numpy
warn(b"please be careful!")
输出:
Traceback (most recent call last):
File "test2.py", line 3, in <module>
warn(b"please be careful!")
TypeError: can't use a string pattern on a bytes-like object
答案 0 :(得分:2)
Numpy会安装一个警告过滤器,并使用正则表达式将此类过滤器与警告文本进行匹配。
使用bytes
对象工作的初始警告只是巧合,API仅支持 string 警告。你看到异常不是Numpy的错,任何警告带有消息组件的过滤器会触发它:
>>> import warnings
>>> warnings.warn(b'careful!')
__main__:1: UserWarning: b'careful!'
>>> warnings.filterwarnings('ignore', message='foo bar')
>>> warnings.warn(b'Do be careful!')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't use a string pattern on a bytes-like object
解决方法是使用API设计,使用字符串警告(或Warning
exception的实例),而不是bytes
个对象。