Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Quando uma função retorna outra função ela tem que dizer o que essa função retornada recebe e o que ela retorna.

Eu tenho uma função que a partir da análise dos parâmetros retorna um outra função de um conjunto de funções. Usando a definição explícitas de tipos, eu posso escrever def x()-> function:

def x() -> typing.Callable: ...

Exemplo, x() é uma função que retornará uma função. A função retornada que recebe duas strings e retorna um inteiro:

def x() -> Callable[[str, str], int]

Não consegui entender isso, parece uma loucura que funciona, parece um Javeiro programando em Python?

2 respostas
solução!

Olá Welton, tudo bem com você?

Peço desculpas pela demora no retorno.

O recurso de typing hint do Python não é um recurso de uso obrigatório da linguagem, seu uso é considerado como uma boa prática de programação, o código ficará mais verboso, mas com essas dicas de tipos termos um um auxílio para entendermos o que uma função ou atributo espera receber e o que ela retorna.

A sintaxe de uso da dica de tipo Callable é a seguinte:

  • Callable[[Tipo_de_entrada], Tipo_de_retorno]

Tomamos como exemplo o seguinte contexto: precisamos de uma função que será responsável por realizar uma soma a um número informado, nomeamos como soma, essa função recebe um valor do tipo int (numero) e retorna um valor do tipo int. Temos:

def somar(numero: int) -> int:
    return numero + 1

Agora, precisamos de uma função que irá receber um valor e recebe nossa função soma como parâmetro, e deverá chamar a função soma e multiplicar o resultado da soma por dois (2) e retornar um valor do tipo int. Nesse momento temos:

def duas_vezes(numero: int, somar: Callable[[int], int]) -> int:
    resultado = somar(numero) * 2
    return resultado

No código acima estamos informando que o parâmetro somar recebe um objeto do tipo Callable, recebendo a função somar e a função somar recebe um valor do tipo int (numero) e retorna um valor do tipo int. Fora isso, o retorno da função duas_vezes será do tipo int.

Juntando as duas funções temos

from typing import Callable

def somar(numero: int) -> int:
    return numero + 1

def duas_vezes(numero: int, somar: Callable[[int], int]) -> int:
    resultado = somar(numero) * 2
    return resultado



print(duas_vezes(3, somar))

Resultado

8

Acima temos representado um dos modelos de uso da dica de tipo Callable.

Você citou sobre Java e algo interessante é que a partir do Java 10 foi implementado uma nova declaração de tipo a Var, fazendo o uso dela o tipo da variável será definida em tempo de compilação com base no código declarado a sua direita, apresentando uma semelhança ao sistema de tipagem dinâmica do Python. Seria um pythonista programando em Java? Hahahaha

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Felippe Rafael,

Muito obrigado pela ajudam agora eu entendi mais um pouco, valeu