Augmenting third-party packages
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 30/100
Hướng nghiên cứu
Không có tệp repository hoặc bài kiểm thử nào được nêu tên. Hãy bắt đầu bằng việc xem xét PEP 561, phần được tham chiếu về phân phối stub trong PEP 484 và các tiền lệ declaration-merging của TypeScript; so sánh các vị trí augmentation được đề xuất và hình dạng của Protocol. Công việc được xem là hoàn tất khi tạo ra một thiết kế đã được thống nhất cho việc định vị, hợp nhất và diễn giải các stub augmentation của bên thứ ba.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Motivation
Some framework packages (like pytest, polars, xarray, …) have APIs that allow plugin packages to define attributes on their classes/singletons using some registration function, e.g.:
import pytest
def pytest_configure(config: pytest.Config) -> None:
config.addinivalue_line("markers", "mychoice(select, skip): choose which stuff to test")
@pytest.mark.mychoice(x=1) # I want to make this into a type error by defining the signature somewhere
def test_thing(): ...
These plugins should have a way to specify the type of the new attribute. In our example, pytest itself has this definition for the type of the pytest.mark object:
@final
class MarkGenerator:
if TYPE_CHECKING:
skip: _SkipMarkDecorator
skipif: _SkipifMarkDecorator
xfail: _XfailMarkDecorator
parametrize: _ParametrizeMarkDecorator
usefixtures: _UsefixturesMarkDecorator
filterwarnings: _FilterwarningsMarkDecorator
# untyped marks:
def __getattr__(self, name: str) -> MarkDecorator: ...
which allows its own defined marks to be typed:
@pytest.mark.skipif(x=None) # this *is* a type error
def test_something(): ...
A plugin needs to have a way to add a new typed attribute to MarkGenerator.
Design considerations
The current way of shipping types has no good way of having potentially multiple stubs that can be merged into one: even if it’s possible to ship pytest/__init__.pyi in one plugin and have it merged with the actual pytest package, only one plugin could do that, and there would be no indication that this .pyi is intended to be an augmentation instead of a replacement for all of pytest’s types.
So we’d need a new way to locate augmentation stubs, I think.
As for how these stubs look like, I think typing.Protocol could do a good job:
A Protocol in an augmentation stub could be interpreted as an augmentation protocol, e.g.
$PYTHONPATH/my-pytest-plugin/typeshedding-location-for-augments/pytest/__init__.pyi or
$PYTHONPATH/typeshedding-location-for-augments/my-pytest-plugin/pytest/__init__.pyi
from typing import Protocol
import pytest
class MarkGenerator(Protocol):
mychoice: _MyChoiceMarkDecorator
class _MyChoiceMarkDecorator(pytest.MarkDecorator):
def __call__( # type: ignore[override]
self,
select: list[str] = ...,
skip: list[str] = ...,
) -> MarkDecorator: ...
Prior art
- TypeScript has this feature, explained here: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
- PEP 484 had a location for distributing stubs outside of the actual package, we could bring it back for augments
- Ngôn ngữ chính
- Python
- Star
- 1.8k
- Fork
- 302
- Merge trung bình
- 23 giờ
- Pull request đã merge (30 ngày)
- 8
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
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.
Issue khác của python/typing
-
topic: typing spec
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
topic: typing spec
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
topic: documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
topic: documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
topic: conformance tests topic: typing spec
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 72/100
Tất cả issue của python/typing
Issue tương tự
-
essnmx good first issue
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 95/100
-
[Feature] 奇物选择添加优先级 Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
syfoud/Simulated_Scepter#174 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Giskard-AI/giskard-oss#2840 · 1 bình luận ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success Đang mởarea: repo bug perceived difficulty: 2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
yeti-platform/yeti#1380 ·