es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Indicación de tipo de una de las funciones predefinidas.

Me gustaría pasar una función como argumento. Esta función debería ser una de estas funciones predefinidas. No tengo idea de cómo agregar pistas.

def func1(a:int, b:int) -> int:
    pass

def func2(a:int, b:int) -> int:
    pass

def func3(a:int, b:int) -> int:
    pass

Me gustaría utilizar una de ellas en algún lugar. Por ejemplo, pasar una de ellas como callable al inicializador de la clase:

class Calculadora:
    def __init__(self, 
                 calculation_function: Callable[ [int, int], int] = None):
        pass

Donde calculation_function debería ser una de las funciones anteriores, no solo callable con entrada/salida de int. En el ejemplo anterior agregué indicaciones con solo callable. Otra función con los mismos argumentos de entrada y tipo de salida sería aceptable para callable, pero me gustaría especificar funciones determinadas como indicación: func1, func2, func3.

¿Hay alguna forma de hacer esto en Python?

PD. Tal vez haya una forma de hacer estas funciones como classmethods y pasar como indicación algo como “cualquier método de esta clase”.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes pasar una de las funciones preestablecidas como argumento utilizando la sugerencia de tipo Callable. También puedes especificar las funciones exactas que deseas pasar como argumentos utilizando la sugerencia de tipo Union. Por ejemplo:

    from typing import Callable, Union
    
    def func1(a:int, b:int) -> int:
        pass
    
    def func2(a:int, b:int) -> int:
        pass
    
    def func3(a:int, b:int) -> int:
        pass
    
    class Calculadora:
        def __init__(self,
                     funcion_de_calculo: Union[Callable[[int, int], int], func1, func2, func3] = None):
            pass
    

    También puedes convertir las funciones en métodos de clase y pasarlos como argumentos utilizando la sugerencia de tipo ClassVar. Por ejemplo:

    from typing import ClassVar
    
    class Calculadora:
        func1: ClassVar[Callable[[int, int], int]]
        func2: ClassVar[Callable[[int, int], int]]
        func3: ClassVar[Callable[[int, int], int]]
    
        def __init__(self,
                     funcion_de_calculo: Union[Callable[[int, int], int], 'Calculadora.func1', 'Calculadora.func2', 'Calculadora.func3'] = None):
            pass
    

Comments are closed.