Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

216
Visualizações
Escriba una sugerencia para Callable que toma kwargs

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?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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 devolviendo ReturnType

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.

over 4 years ago · Santiago Trujillo Relatório

0

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)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda