为什么仅在分配给变量时才创建此memoryview会引发ValueError?

时间:2015-02-24 23:27:27

标签: python numpy read-eval-print-loop memoryview structured-array

Pythons memoryview执行not support datetime64 or timedelta。好。但是,当我尝试创建包含memoryviewdatetime64的结构化数组的timedelta时,它似乎有效... 除非我将其分配给变量

In [19]: memoryview(zeros(10, dtype=[("A", "m8[s]")]))
Out[19]: <memory at 0x7f1d455d6048>

In [20]: x = memoryview(zeros(10, dtype=[("A", "m8[s]")]))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: cannot include dtype 'm' in a buffer

In [21]: x = _19

In [22]: x
Out[22]: <memory at 0x7f1d455d6048>

这严重挑战了我对Python基本工作方式的理解。考虑到(1)IPythons REPL无论如何都将输出分配给f(),以及(2)函数/类x = f()没有办法,_19memoryview如何不同?了解调用者将如何处理其输出?

我正在运行Python 3.4.1上的代码,numpy 1.10.0.dev + fbcc24f,在Linux 2.6.32-431.23.3.el6.x86_64,Scientific Linux 6.6版上。


修改

在Python 3.5上,numpy 1.10.4,我得到:

In [50]: memoryview(numpy.zeros(10, dtype=[("A", "m8[s]")]))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: cannot include dtype 'm' in a buffer

During handling of the above exception, another exception occurred:

SystemError                               Traceback (most recent call last)
<ipython-input-50-5d5ac6c085fa> in <module>()
----> 1 memoryview(numpy.zeros(10, dtype=[("A", "m8[s]")]))

SystemError: <class 'memoryview'> returned a result with an error set

我已经提交了bug with numpy,虽然我不太确定问题出在哪里。

1 个答案:

答案 0 :(得分:3)

这里有一些奇怪的事情。

>>> memoryview(zeros(10, dtype=[("A", "m8[s]")]))
<memory at 0x102654348>
>>> 
ValueError: cannot include dtype 'm' in a buffer

我的猜想是,这与https://bugs.python.org/issue23571有关。一些C函数底层memoryview都返回非null结果并设置错误标志。这显然导致在执行 next 语句时引发错误!在Python 3.5中,当出现这种情况时,解释器会引发SystemError

这里真正的错误似乎是memoryview函数,而不是numpy。