Com o seguinte exemplo:
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 diz:
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
fonte
fonte
new_find_fixed_point
como uma função genérica com sua própria instanciação separada deThetaType
eXType
.Respostas:
Não tenho certeza se concordo com a premissa desta pergunta.
Aqui está parte do docstring de 3.8
Agora, se você tivesse acabado de
você estaria argumentando que os usos do ThetaType devem ser considerados usos do XType, mesmo que 2 tipos de caracteres diferentes tenham sido configurados? Por que adicionar o
bound
argumento opcional os recolheria automaticamente novamente? A fonte não impõe a presença de um limite, ou qualquer argumento ao lado do nome, de forma alguma.Eu não acho que seja o trabalho de digitar / mypy inferir suas intenções em declarações de tipo , apenas para verificar seu código x suas intenções de tipo declaradas . Se você deseja que sejam iguais, declare apenas 1 TypeVar. Considerá-los iguais pode perder algum significado semântico se você tiver motivos reais para ter 2.
Vou acrescentar que
bound
permite mais flexibilidade doconstraints
que corresponde às subclasses. Digamos que você tenha definido 4 subclasses de int. Int1 (int), Int2, Int3, Int4 .... Agora você decidiu particionar seu código onde alguns deles devem aceitar apenas Int1 e Int2. Typevarint12 poderia expressar isso, mesmo que todas as suas subclasses correspondambound=int
.fonte