19

Python のmemoryviewはorをサポートdatetime64timedeltaしていませ。Ok。しかし、またはmemoryviewを含む構造化配列のを作成しようとすると、うまくいくように見えます...変数に割り当てない限り!datetime64timedelta

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) とにかく IPythons REPL が出力を割り当て、(2) 関数/クラスには、呼び出し元がその出力で何をしようとしているのかを知る方法がないことを考えるf()と、どのように異なるのでしょうか?x = f()_19memoryview

Python 3.4.1、numpy 1.10.0.dev+fbcc24f、Linux 2.6.32-431.23.3.el6.x86_64、Scientific Linux リリース 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 でバグを報告しました。

4

1 に答える 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は、null 以外の結果を返し、エラー フラグを設定しています。これにより、次のステートメントが実行されたときにエラーが発生するようです。SystemErrorPython 3.5 では、この条件が発生すると、インタープリターは代わりに a を発生させます。

ここでの本当のバグはmemoryview、numpy ではなく関数にあるようです。

于 2016-08-10T07:45:28.300 に答える