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

Why does creating this memoryview raise a ValueError only when assigning to a variable?

Pythons memoryview does not support datetime64 or timedelta。好的。但是,当我尝试创建包含 datetime64timedelta 的结构化数组的 memoryview 时,它似乎可以工作... 除非我将其分配给变量!

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 基本工作方式的理解。 f()x = f() 有何不同,考虑到 (1) IPythons REPL 无论如何都会将输出分配给 _19,以及 (2) function/class memoryview 无法知道调用者将对其输出做什么?

我是 运行 Python 3.4.1 上的代码,numpy 1.10.0.dev+fbcc24f,Linux 2.6.32-431.23.3.el6 上的代码.x86_64,科学 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,虽然我不太确定问题出在哪里。

这里发生了一些非常奇怪的事情。

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

我的推测是这与https://bugs.python.org/issue23571有关。 memoryview 下的某些 C 函数既返回非空结果又设置错误标志。这显然会导致在执行 next 语句时引发错误!在 Python 3.5 中,解释器会在这种情况发生时引发 SystemError

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