Documenting specialisation rules
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Documentación
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- python
- Área
- documentation
Línea de trabajo
Comienza leyendo los enlaces a PEP 718 y PEP 696 y las reproducciones enlazadas de MyPy y Pyright; después, compara el comportamiento de especialización descrito en los ejemplos. Determina qué reglas están acordadas y dónde deben ubicarse en la documentación de typing. Se considera terminado cuando las reglas, incluido el caso de new, estén documentadas con los ejemplos relevantes y ya no dependan de una interpretación no resuelta.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I wasn't aware there were discrepancies between type checkers about this. Coming from https://github.com/microsoft/pyright/issues/5830, PEP 718 will require documentation about specialisation for functions and PEP 696 requires documentation about whether methods should bind default type parameters for the class.
PEP 718 problems
from typing_extensions import assert_type
class Foo[T, U]:
def bar(self): ...
class Baz[U](Foo[int, U]):
...
# sorry for using PEP 677 syntax but it's easier to follow
# also Unknown is implicit Any (borrowed from pyright)
assert_type(Foo.bar, (self: Foo[Unknown, Unknown]) -> None)
assert_type(Baz.bar, (self: Foo[int, Unknown]) -> None)
assert_type(Foo[str, str].bar, (self: Foo[str, str]) -> None)
Foo[str, int].bar(Foo[str, int]()) # fine
Foo[int, int].bar(Baz[int]()) # fine
Baz.bar(Foo[str, int]()) # should error as Self is bound to Baz not Foo
MyPy
MyPy currently shows methods not binding type parameters at all which is problematic as type parameters should be bound in the scope they are defined. This behaviour is also I think incorrect in allowing the final call to pass as it is ignoring the specialisation of the class.
Pyright
Pyright currently shows, it isn't binding U to Unknown.
PEP 696 problems
from typing_extensions import assert_type
class Spam[T=int]:
def meth[U](self, another: U, other: T) -> U:
...
assert_type(Spam.meth, (self: Spam[int], another: U, other: int) -> U)
MyPy
MyPy currently shows and appears to be binding T's default as I thought it should (good mind reading skills Marc), however, it is still suffering from the problems proposed above and would ignore any prior specialisation.
Pyright
Pyright currently shows meth as being partially unknown which is what I opened the original issue about.
A __new__ issue (🥁) W.R.T. PEP 718
Say I have a generic __new__/__init__ method that uses parameters that aren't bound by the class.
class New[T]:
def __new__[U](cls, arg: T, l: list[U], elem: U):
self = super().__new__(cls)
l.append(elem)
This may seem a bit contrived but it can come up where there's a mapping between types e.g. for registering types for serialisation.
How should this be specialisable? A couple of options:
New[T, U]()is fine:
What about if it's added in init?Class[ClassParams, ..., NewParams, ..., InitParams, ...]- Should order be lexicographical? I don't think there's a world in which this is practical
- Manually call through the
__new__method yourself and__init__can't add any new type parameters.
My preference would be manually constructing the class through __new__ because the other case seems full of edge cases and is a special case with no real gain.
Summary of my thoughts
class Summary0[T, U]:
def bar(self): ...
class Summary0Sub[U](Summary0[int, U]):
...
# Summary0 should bind type parameters in the scope they were defined
Summary0.bar # should warn about implicit Any
# A specialised Summary0 should modify the type of self in methods
Summary0[int, bool].bar # `self` should be Summary0[int, bool]
Summary0Sub[bool].bar # `self` should be Summary0Sub[bool]
class Summary1[T=int]:
def meth(self) -> T: ...
# defaults should bind on method access if not specialised
assert_type(Summary1().meth(), int)
assert_type(Summary1[str]().meth(), str)
class Summary2[T]:
def id[U](self, x: U) -> tuple[T, U]: ...
assert_type(Summary2[bool]().id[str]("hi"), tuple[bool, str])
Summary2.id[int, str] # error expected 1 type param not 2
class Summary3[T]:
def __new__[U](cls, arg: T, l: list[U], elem: U): ...
Summary3[int].__new__[complex](1, [], 1j)
Summary3[int, complex](1, [], 1j) # errors because special cases aren't special enough to break the rules
Does anyone have any objections to this? Where is this best documented neither PEP really feels like the right place for all of this.
Would be nice to hear from the MyPy and Pyright teams on this.
- Lenguaje dominante
- Python
- Estrellas
- 1.8k
- Forks
- 302
- Merge medio
- 23 h
- PR fusionados (30 d)
- 8
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de python/typing
-
topic: typing spec
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
topic: typing spec
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
topic: documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
-
topic: documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
topic: conformance tests topic: typing spec
Dificultad 3/5 1-2 días Aptitud para principiantes 72/100
Todos los issues de python/typing
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
learningequality/ricecooker#747 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
BSData/horus-heresy-3rd-edition#3171 ·
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
run-llama/llama_index#23199 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
KhronosGroup/glTF-Blender-IO#2769 ·