为什么创建这个memoryview只有在赋值给变量时才会引发ValueError?

19

Python的memoryview不支持datetime64timedelta。但是当我尝试创建一个包含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基本工作原理的理解。考虑到(1) IPython会将输出分配给“_19”,(2)函数/类` memoryview `无法知道调用者对其输出做什么,为什么`f()`和` x = f()`会有所不同呢?
我在Python 3.4.1上运行此代码,numpy版本为1.10.0.dev+fbcc24f,在Linux 2.6.32-431.23.3.el6.x86_64、Scientific Linux release 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

我已经提交了一个numpy的错误报告,尽管我不太确定问题是否就出在那里。

2
尽管出现了ValueError,但[20]中的赋值仍然成功。在赋值后立即查看变量x,您会发现它实际上已经被赋值了。(很抱歉,我不知道是什么导致了ValueError。) - Warren Weckesser
@WarrenWeckesser 哦,确实是这样。我没想到要检查一下。 - gerrit
这似乎是 Python 的 theading 模块中的一个 bug(尝试在没有 IPython 的脚本中运行上述代码),我以前从未见过这样的情况。 - Bi Rico
如果我在普通的Python shell中运行相同的序列,我不会在赋值语句中得到ValueError。当我尝试通过只键入名称并按回车键来显示x时,就会出现ValueError。因此,>>> x = memoryview(...)“有效”,但是然后>>> x会引发ValueError。 - Warren Weckesser
线程库在哪里涉及?使用joblib时,我的实际问题深入到了我的代码中,结果是一个回溯指向完全不相关的位置,除非我使用ipdb逐步执行,这将导致没有相关错误。 - gerrit
这里发生了非常奇怪的事情。实际上,当您执行第一个语句后的任何语句时,会出现ValueError - augurar
1个回答

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返回一个非空结果并设置了一个错误标志。显然,当执行下一个语句时会导致错误被触发!在Python 3.5中,解释器在出现此情况时会引发SystemError

看起来真正的bug在于memoryview函数,而不是numpy。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接