Estou adicionando dicas de tipo a um código antigo meu. No entanto, encontro um "problema" que não sei como resolver. Tenho uma função que se parece com:
def f(x: tuple[tuple[int, int], ...]):
...
Ou seja, ele aceita um argumento que é uma tupla de pares int. Em algum ponto do código eu chamo essa função passando como argumento a saída de itertools.product
from itertools import product
x = tuple(product(range(10), repeat=2))
f(x)
O código funciona sem problemas, pois x
é uma tupla de 100 pares inteiros. No entanto, mypy reclama com o erro
error: Argument 1 to "tuple" has incompatible type "product[tuple[int, ...]]"; expected "Iterable[tuple[int, int]]" [arg-type]
Existe uma maneira de superar esse problema?
Isso acontece devido à seguinte sobrecarga ( de
typeshed
):Devido às limitações do sistema de tipos, a única maneira de obter melhores resultados é ter algumas sobrecargas mais específicas no mesmo lugar:
(parques infantis: Mypy , Pyright )
No entanto, não há tais sobrecargas. Nem é preciso dizer que essa abordagem não escala muito bem, já que o número de sobrecargas necessárias crescerá exponencialmente conforme o número de
iterable
s aumenta, embora você possa tentar abrir um issue para solicitar isso.Enquanto isso, é necessário usar
cast()
ou# type: ignore
: