Buffer requests - `itemsize`, `format`, and `PyBUF_SIMPLE`
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 35.9k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Documentation
I am trying to understand the full interaction between itemsize and format in the buffer requests documentation.
Q: If PyBuf_FORMAT is not set in the request, and shape is not NULL, is the real format unknown (real size specified by itemsize) or required to be "B" format?
To quote some pieces:
From itemsize:
Important exception: If a consumer requests a buffer without the PyBUF_FORMAT flag, format will be set to NULL, but itemsize still has the value for the original format.
If shape is NULL as a result of a PyBUF_SIMPLE or a PyBUF_WRITABLE request, the consumer must disregard itemsize and assume itemsize == 1.
From format:
A NULL terminated string in struct module style syntax describing the contents of a single item. If this is NULL, "B" (unsigned bytes) is assumed.
This seems to imply the following contradictory statements to me:
- From itemsize: If
PyBUF_FORMATis not set in the request, then the exporter must leaveformatasNULL. The original format is unknown to the requester, howeveritemsizemust match the original format's size. - From format: If
PyBUF_FORMATis not set in the request, then the exporter must leaveformatasNULL. The format is assumed to be"B"format.
Reading further, the docs also state
PyBUF_FORMAT must be |’d to any of the flags except PyBUF_SIMPLE, because the latter already implies format B (unsigned bytes). PyBUF_FORMAT cannot be used on its own.
It is unclear to me whether this means:
- All requests other than
PyBUF_SIMPLEorPyBUF_WRITABLEmust also setPyBUF_FORMAT, or PyBUF_FORMAT,PyBUF_SIMPLE | PyBUF_FORMATandPyBUF_WRITABLE | PyBUF_FORMATare disallowed combinations.
If PyBUF_FORMAT must always be set for nontrivial requests, I think a lot of my confusion above goes away, but the fact that the docs seem to allow for NULL format makes me think this is not the case. (Also compound requests such as PyBUF_STRIDED_RO do not set PyBUF_FORMAT.)
On the other hand, I don't see much technical justification for why standalone PyBUF_FORMAT (optionally in combination with PyBUF_SIMPLE or PyBUF_WRITABLE) would be forbidden. It seems reasonably clear to me that this would have to imply the exporter provides a 1D contiguous array where any format is allowed.
I found #123778 which made some changes in this direction, cc @encukou @ZeroIntensity
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với các phần trong tài liệu buffer của C API về itemsize, format, PyBUF_SIMPLE và PyBUF_FORMAT, sau đó đọc issue #123778 để nắm ngữ cảnh liên quan. Công việc được xem là hoàn tất khi tài liệu giải thích nhất quán ngữ nghĩa của itemsize và format, đồng thời xác định rõ các tổ hợp flag hợp lệ và không hợp lệ.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- documentation
- Loại issue
- Tài liệu
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100