Estou tentando criar uma função que retorna um callable parcialmente aplicado, mas estou tendo problemas com a verificação de tipo mypy.
Aqui está minha primeira implementação:
Ajude-me a explicar minha pergunta para o stackoverflow. Ou seja, encontre um título e o corpo
este código:
from collections.abc import Callable
from functools import partial
def f(i: int, j: float, k: int) -> int:
return i + int(j) + k
def g(a: float) -> Callable[[int, int], int]:
return partial(f, j=a)
fun: Callable[[int, int], int] = g(3.0)
r: int = fun(4, 5)
print(r)
Foi verificado com sucesso pelo mypy
mas não pode correr
r: int = fun(4, 5) TypeError: f() obteve vários valores para o argumento 'j'
para resolver esse problema, chamo a função com argumento nomeado
from functools import partial
def f(i: int, j: float, k: int) -> int:
return i + int(j) + k
def g(a: float) -> Callable[[int, int], int]:
return partial(f, j=a)
fun: Callable[[int, int], int] = g(3.0)
# line 12 in my code (where the error message comes from)
r: int = fun(i=4, k=5)
print(r)
funciona bem agora
mas a verificação mypy falha
main.py:12: erro: Argumento de palavra-chave inesperado "i" [call-arg] main.py:12: erro: Argumento de palavra-chave inesperado "k" [call-arg] Foram encontrados 2 erros em 1 arquivo (1 arquivo de origem foi verificado)
Existe uma maneira de anotar esse código para que ele seja executado corretamente e passe na verificação de tipo do mypy? Eu tentei várias combinações de dicas de tipo, mas não encontrei uma solução que satisfaça tanto o comportamento de tempo de execução quanto a verificação de tipo estática.
Eu sei que existe essa solução, sem usar Partial
from collections.abc import Callable
def f(i :int,j : float,k :int) ->int:
return i+int(j)+k
def g(a :float) -> Callable[[int,int],int]:
def ret(i,k):
return f(i,a,k)
return ret
fun :Callable[[int,int],int]= g(3.0)
r : int = fun(4,5)
print(r)
Mas eu realmente quero usar Callable porque estou trabalhando com funções com muitos parâmetros e é muito mais simples apenas dizer quais parâmetros são substituídos