python - ¿Por qué crear esta vista de memoria genera un ValueError solo al asignar una variable?
numpy read-eval-print-loop (1)
Hay algo muy extraño aquí.
>>> memoryview(zeros(10, dtype=[("A", "m8[s]")]))
<memory at 0x102654348>
>>>
ValueError: cannot include dtype ''m'' in a buffer
Mi conjetura es que esto está relacionado con https://bugs.python.org/issue23571 . Algunas funciones de C que subyacen a la vista de memoryview
devuelven un resultado no nulo y establecen un indicador de error. ¡Esto aparentemente causa que el error se levante cuando se ejecuta la siguiente declaración! En Python 3.5, el intérprete genera un SystemError
en SystemError
lugar cuando se produce esta condición.
Parece que el error real aquí está con la función de vista de memoryview
, no con numpy.
Pythons memoryview no admite datetime64
o timedelta
. De acuerdo. Pero cuando intento crear una memoryview
de memoryview
de una matriz estructurada que incluye datetime64
o timedelta
, parece funcionar ... ¡a menos que lo asigne a una variable !
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>
Esto desafía seriamente mi comprensión de la forma en que Python funciona fundamentalmente. ¿Cómo pueden ser diferentes f()
x = f()
, considerando que (1) IPythons REPL asigna la salida a _19
todos modos, y (2) la función / vista de memoryview
clase no tiene forma de saber qué hará la persona que llama? su salida?
Estoy ejecutando el código en Python 3.4.1, numpy 1.10.0.dev + fbcc24f, en Linux 2.6.32-431.23.3.el6.x86_64, Scientific Linux versión 6.6.
EDITAR
En Python 3.5, numpy 1.10.4, obtengo:
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
He archivado un error con numpy , aunque no estoy seguro de que ese sea el problema.