19

Pythons memoryview tut not support datetime64 or timedelta. OK. Aber wenn ich versuche, ein memoryview eines strukturierten Arrays zu erstellen, das eine datetime64 oder timedelta enthält, scheint es zu funktionieren ... , wenn ich es nicht einer Variablen zuweisen!Warum verursacht das Erstellen dieser Speicheransicht einen ValueError nur beim Zuweisen zu einer Variablen?

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> 

Diese Herausforderungen ernsthaft mein Verständnis der Art und Weise Python grundsätzlich funktioniert. Wie kann f() und x = f() anders sein, wenn man bedenkt, dass (1) IPythons REPL die Ausgabe sowieso _19 zuweist, und (2) die Funktion/Klasse memoryview keine Möglichkeit hat zu wissen, was der Aufrufer mit seiner Ausgabe machen wird?

Ich führe den Code auf Python 3.4.1, numpy 1.10.0.dev + fbcc24f, auf Linux 2.6.32-431.23.3.el6.x86_64, Scientific Linux Release 6.6.


EDIT

auf Python 3.5, numpy 1.10.4, erhalte ich:

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 

ich ein bug with numpy eingereicht haben, obwohl ich nicht ganz sicher bin, das ist, wo das Problem Lügen.

+2

Trotz des ValueError war die Zuweisung in '[20] 'erfolgreich. Sehen Sie sich direkt nach der Zuweisung die Variable "x" an. Sie werden sehen, dass ihm tatsächlich ein Wert zugewiesen wurde. (Sorry, ich weiß nicht, was den ValueError verursacht.) –

+0

@WarrenWeckesser Huh, tatsächlich tut es. Es kam mir nicht in den Sinn zu überprüfen. – gerrit

+0

Das sieht aus wie ein Fehler im 'theading'-Modul von Python (versuchen Sie, den obigen Code in einem Skript ohne ipython auszuführen), ich habe noch nie so etwas gesehen. –

Antwort

2

Hier ist etwas sehr merkwürdig.

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

Meine Vermutung ist, dass dies zu https://bugs.python.org/issue23571 zusammenhängt. Eine C-Funktion, die memoryview zugrunde liegt, gibt beide ein Nicht-Null-Ergebnis zurück und setzt ein Fehler-Flag. Dies führt offensichtlich dazu, dass der Fehler ausgelöst wird, wenn die Anweisung next ausgeführt wird! In Python 3.5 löst der Interpreter stattdessen eine SystemError aus, wenn diese Bedingung eintritt.

Es scheint, als wäre der eigentliche Fehler hier mit der memoryview Funktion, nicht mit numpy.