19

Pythons memoryview hiện not support datetime64 or timedelta. Được. Nhưng khi tôi cố gắng tạo một memoryview của một mảng có cấu trúc bao gồm datetime64 hoặc timedelta, nó có vẻ hoạt động ... trừ khi tôi gán nó cho biến!Tại sao tạo bộ nhớ này chỉ tăng giá trị ValueError khi gán cho một biến?

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> 

Điều này nghiêm túc thách thức sự hiểu biết của tôi về cách thức cơ bản của Python hoạt động. Làm thế nào có thể f()x = f() khác nhau, vì (1) IPythons REPL gán đầu ra là _19, và (2) chức năng/lớp memoryview không có cách nào để biết người gọi sẽ làm gì với đầu ra của nó?

Tôi đang chạy mã trên Python 3.4.1, numpy 1.10.0.dev + fbcc24f, trên Linux 2.6.32-431.23.3.el6.x86_64, Bản phát hành khoa học Linux 6.6.


EDIT

Mở Python 3.5, numpy 1.10.4, tôi nhận được:

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 

tôi đã nộp đơn bug with numpy, mặc dù tôi không hoàn toàn chắc chắn đó là nơi mà vấn đề dối trá.

+2

Mặc dù ValueError, phép gán trong '[20]' đã thành công. Hãy xem biến 'x' ngay sau khi gán. Bạn sẽ thấy rằng trên thực tế, nó đã được gán một giá trị. (Xin lỗi, tôi không biết điều gì đang gây ra lỗi ValueError.) –

+0

@WarrenWeckesser Huh, quả thật vậy. Nó không xảy ra với tôi để kiểm tra. – gerrit

+0

Điều này giống như một lỗi trong mô-đun 'theading' của python (thử chạy đoạn mã trên trong một kịch bản không có ipython), tôi chưa bao giờ thấy bất cứ điều gì giống như nó trước đây. –

Trả lời

2

Có điều gì đó rất kỳ lạ xảy ra ở đây.

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

Giả thuyết của tôi là điều này liên quan đến https://bugs.python.org/issue23571. Một số hàm C nằm bên dưới memoryview vừa trả về kết quả không trống và thiết lập cờ báo lỗi. Điều này dường như gây ra lỗi khi được tuyên bố tiếp theo! Trong Python 3.5, thông dịch viên tăng SystemError thay vì khi điều kiện này xảy ra.

Dường như lỗi thực sự ở đây là với chức năng memoryview, không phải với sự lố bịch.

Các vấn đề liên quan