python / python/typeshed

Missing reflected dunder methods from AbstractSet

Đang mở
#15,532 0 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Python
Star
5.1k
Fork
2.1k
Merge trung bình
1 ngày 19 giờ
Pull request đã merge (30 ngày)
82

Mô tả

Problem

Reflected operations (__rand__, __ror__, __rsub__, __rxor__) are missing from AbstractSet and its subclasses.

These are noted as explicit exclusions from tests: https://github.com/python/typeshed/blob/9f8f621918e4a187c49d68290a89f5f3dbe0cba9/stdlib/%40tests/stubtest_allowlists/common.txt#L50-L54

Example of consequences

@samueljsb and I have defined a protocol (in another project) for an object which has an __rsub__ method, and discovered that set, despite implementing this method, does not adhere to the protocol.

A simplified illustration of this issue is:

from typing import Any, Protocol

class Subtractable(Protocol):
    def __rsub__(self, other: Any) -> Any: ...

_: Subtractable = set()
$ mypy t.py
t.py:6: error: Incompatible types in assignment (expression has type "set[Never]", variable has type "Subtractable")  [assignment]
Found 1 error in 1 file (checked 1 source file)

Demonstrated with:

  • mypy 1.19.1 (compiled: yes)
  • Python 3.14.2 (main, Dec 5 2025, 16:49:16) [Clang 17.0.0 (clang-1700.4.4.1)]

Investigation

The exclusions reference https://github.com/python/typeshed/issues/7414, which was an attempt to add type hints for them. It was closed without merging because it encountered errors. We believe it encountered errors because the type signatures were wrong. Specifically, it didn't account for the return types of the operations matching the inputs.

For example, instead of:

def __rsub__(self, s: AbstractSet[_T]) -> AbstractSet[_T]: ...

We believe the signature needs to be (in the new syntax):

def __rsub__[T_Set: AbstractSet](self, other: T_Set) -> T_Set: ...

The above can be applied to __rsub__ and __rand__, because those methods return a subset of the input, and therefore will not change its type.

__ror__ and __rxor__ are more complicated because they return a type which is a superset of both inputs. We haven't yet looked into how to solve those.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. 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 mục loại trừ trong stdlib/@tests/stubtest_allowlists/common.txt và so sánh triển khai AbstractSet trong Lib/_collections_abc.py của CPython. Theo dõi các stub và lớp con của AbstractSet, xác định các chữ ký tương thích cho cả bốn phương thức phản chiếu, sau đó xác nhận rằng có thể xóa các mục loại trừ khi các bài kiểm tra stub liên quan đều vượt qua.

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
devtools
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
38/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.