Con el siguiente ejemplo:
from typing import Callable, Generic, Type, TypeVar
ThetaType = TypeVar('ThetaType', bound=int)
XType = TypeVar('XType', bound=int)
class IteratedFunction(Generic[ThetaType, XType]):
def find_fixed_point(self,
theta: ThetaType,
x_init: XType) -> XType:
return x_init
def combinator(
iterated_function_cls: Type[
IteratedFunction[ThetaType, XType]]) -> Callable[
[IteratedFunction[ThetaType, XType]], XType]:
old_find_fixed_point = iterated_function_cls.find_fixed_point
def new_find_fixed_point(
iterated_function: IteratedFunction[ThetaType, XType],
theta: ThetaType,
x_init: XType) -> XType:
return old_find_fixed_point(iterated_function, theta, x_init)
return new_find_fixed_point
MyPy dice:
a.py:25: error: Incompatible return value type (got "XType", expected "XType")
a.py:25: error: Argument 1 has incompatible type "IteratedFunction[ThetaType, XType]"; expected "IteratedFunction[ThetaType, XType]"
a.py:25: error: Argument 2 has incompatible type "ThetaType"; expected "ThetaType"
a.py:25: error: Argument 3 has incompatible type "XType"; expected "XType"
a.py:27: error: Incompatible return value type (got "Callable[[IteratedFunction[ThetaType, XType], ThetaType, XType], XType]", expected "Callable[[IteratedFunction[ThetaType, XType]], XType]")
python
mypy
python-typing
Neil G
fuente
fuente
new_find_fixed_point
como una función genérica con su propia instanciación separada deThetaType
yXType
.Respuestas:
No estoy seguro de estar de acuerdo con la premisa de esta pregunta.
Aquí hay parte de la cadena de documentación de 3.8
Ahora, si solo tuvieras
¿Estaría argumentando que los usos de ThetaType deberían considerarse usos de XType, a pesar de que se configuraron 2 tipos de letra diferentes? ¿Por qué agregar el
bound
argumento opcional automáticamente los contraería nuevamente? La fuente no exige la presencia de enlaces, o cualquier argumento al lado del nombre, de ninguna manera.No creo que sea tarea de tipear / mypy inferir sus intenciones en las declaraciones de tipo , solo para verificar su código frente a sus intenciones de tipo declaradas . Si quiere que sean iguales, declare solo 1 TypeVar. Considerarlos iguales podría perder algún significado semántico si tuviera razones reales para tener 2.
Agregaré a eso
bound
permite más flexibilidad queconstraints
como coincide en las subclases. Digamos que ha definido 4 subclases de int definidas por el usuario. Int1 (int), Int2, Int3, Int4 ... Ahora ha decidido particionar su código donde algunos de ellos solo deberían aceptar Int1 e Int2. Typevarint12 podría expresar algo así, a pesar de que todas sus subclases coincidenbound=int
.fuente