python3:warnings.warn()在numpy导入后崩溃在bytes对象上

时间:2014-04-21 07:54:04

标签: python python-3.x numpy

我正在为一个非常奇怪的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

1 个答案:

答案 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个对象。