quiero hacer algo como
from typing import Callable def a(foo: Callable[[int], None]): foo(b=5) Este código funciona, pero da una advertencia Unexpected argument .
Definiendo como
def a(foo: Callable[[int], None]): foo(5)funciona sin advertencias como se esperaba.
¿Cómo puedo pasar un argumento esperado como un kwarg a una función sin que el verificador de tipos esté enojado conmigo?
Los documentos Callable dicen
No hay sintaxis para indicar argumentos opcionales o de palabras clave; estos tipos de función rara vez se utilizan como tipos de devolución de llamada.
Sin embargo también dicen
Callable[..., ReturnType](puntos suspensivos literales) se puede usar para escribir sugerencias de un callable tomando cualquier número de argumentos y devolviendoReturnType
Aplicando aquí, eso sería
def a(foo: Callable[..., None]): Perderá la anotación int , pero es eso, vivir con la advertencia o superarla explícitamente.
Puede usar un "protocolo invocable" aquí, así que:
import typing class MyCallableType(typing.Protocol): def __call__(self, bar:int) -> None: ... def a(foo: MyCallableType): foo(32) foo(bar=32) Ahora, probando lo anterior con mypy :
jarrivillaga$ mypy --version mypy 0.910 jarrivillaga$ mypy test.py Success: no issues found in 1 source file Tenga en cuenta que esto permite que mypy detecte todo tipo de errores, por ejemplo, una función con el nombre de argumento incorrecto, o si queremos que b sea una función que especifique un argumento de barra solo de palabra clave:
import typing class MyCallableType(typing.Protocol): def __call__(self, b:int) -> None: ... def a(foo: MyCallableType): foo(32) foo(b=32) def bar(b: int) -> None: pass def baz(*, b: int) -> None: pass def bing(x: int) -> None: pass a(bar) a(baz) a(bing)Y mypy se quejará con lo siguiente:
jarrivillaga$ mypy test.py test.py:21: error: Argument 1 to "a" has incompatible type "Callable[[NamedArg(int, 'b')], None]"; expected "MyCallableType" test.py:22: error: Argument 1 to "a" has incompatible type "Callable[[int], None]"; expected "MyCallableType" Found 2 errors in 1 file (checked 1 source file)