Augmenting third-party packages
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 30/100
Direção de pesquisa
Nenhum arquivo do repositório ou teste é mencionado. Comece revisando a PEP 561, a seção referenciada da PEP 484 sobre distribuição de stubs e os precedentes de declaration merging do TypeScript; compare os locais de augmentation propostos e o formato de Protocol. O trabalho estará concluído quando for produzido um design acordado para localizar, mesclar e interpretar stubs de augmentation de terceiros.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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
- Linguagem predominante
- Python
- Estrelas
- 1.8k
- Forks
- 302
- Merge médio
- 23h
- PRs com merge (30d)
- 8
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de python/typing
-
topic: typing spec
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
topic: typing spec
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
-
topic: documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
-
topic: documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
-
topic: conformance tests topic: typing spec
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 72/100
Todas as issues de python/typing
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
anthropics/skills#1811 · 1 comentário ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
speaches-ai/speaches#678 ·
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
datalayer/mcp-compose#42 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
conda-forge/spacy-feedstock#177 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
UKGovernmentBEIS/inspect_evals#2523 ·