Подтвердить что ты не робот

Почему создание этого memoryview повышает значение ValueError только при назначении переменной?

Pythons memoryview не поддерживает datetime64 или timedelta. ОК. Но когда я пытаюсь создать memoryview структурированного массива, который включает в себя datetime64 или 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. Как могут f() и x = f() быть разными, учитывая, что (1) IPythons REPL назначает вывод на _19 в любом случае, и (2) функция/класс memoryview не имеет способа узнать, что вызывающий абонент собирается делать с его выходом?

Я запускаю код на 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, хотя я не совсем уверен, что там, где проблема.

4b9b3361

Ответ 1

Здесь происходит что-то очень странное.

>>> 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 вместо этого условия.

Кажется, что настоящая ошибка здесь с функцией memoryview, а не с numpy.