19

Pythons memoryview. not support datetime64 or timedelta. ОК. Но когда я пытаюсь создать memoryview структурированного массива, который содержит datetime64 или timedelta, он работает ... , если я не назначил его переменной!Почему создание этого memoryview повышает значение ValueError только при назначении переменной?

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.


EDIT

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

+2

Несмотря на ValueError, присваивание в '[20]' преуспело. Взгляните на переменную 'x' сразу после назначения. Вы увидите, что на самом деле ему присвоено значение. (Извините, я не знаю, что вызывает ValueError.) –

+0

@WarrenWeckesser. Да, действительно. Мне не приходилось проверять. – gerrit

+0

Это похоже на ошибку в модуле «theading» python (попробуйте запустить вышеуказанный код в скрипте без ipython), я никогда раньше не видел ничего подобного. –

ответ

2

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

>>> 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.