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.

¿Es “Pythonico” verificar tipos de argumentos de función?

Procedente del entorno de C/C++, siempre me ha desconcertado la falta de comprobación de tipos de Python. Por ello, siempre he tendido a escribir código de este tipo:

def function(this_debería_ser_lista, this_debería_ser_entero):
    isFristArgList = isinstance(this_debería_ser_lista,list)
    if not isFristArgList:
        raise Exception("¡El primer argumento debería ser una lista!")

    isSecondArgInt = isinstance(this_debería_ser_entero,int)
    if not isSecondArgInt:
        raise Exception ("¡El segundo argumento debería ser un entero!")

    ....
    ....
    ....
    return

Lo que lleva a un código ligeramente más complicado y redundante, que va en contra de lo que, en mi opinión, debería ser la “filosofía de Python” de escribir un código claro y conciso. En oposición a este enfoque de comprobación dinámica, puede que alguien argumente que, sin ella, la función también fallaría y lanzaría una excepción, por lo que no marca ninguna diferencia real. Sin embargo, yo argumentaría que es difícil prever (especialmente en proyectos más grandes y con múltiples llamadas anidadas) si existe algún error en un caso concreto que haga que la función se ejecute correctamente en “superficie”, pero no de la forma en que se pretendía.

Entonces, mi pregunta es, ¿cómo debería abordar esto en Python? ¿Simplemente estoy sesgado hacia un estilo con comprobación de tipos fuerte debido a mi experiencia previa con C/C++, y debería aceptar la naturaleza “encapsulada” de Python? ¿O hay alguna forma más elegante de comprobar tipos en Python?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Python, tipado fuerte y tipado de pato, diría que la falta de verificación de tipo fuerte en Python es en realidad una de sus fortalezas. El enfoque del tipado de pato permite más flexibilidad y legibilidad en el código, y puede conducir en última instancia a un desarrollo más eficiente.

    Dicho esto, aún es importante asegurarse de que los parámetros de entrada de una función coincidan con los tipos esperados. Una manera de lograr esto es a través del uso de sugerencias de tipo en Python 3.5+. Las sugerencias de tipo permiten a los desarrolladores anotar su código con los tipos esperados de los parámetros y resultados, sin hacerlos cumplir realmente en tiempo de ejecución.

    Por ejemplo, el código anterior podría escribirse como:

    def function(esto_debería_ser_lista: lista, esto_debería_ser_entero: int) -> Nada:
        ....
        ....
        ....
        return Nada
    

    Este código establece explícitamente que el primer parámetro debe ser de tipo lista y que el segundo parámetro debe ser de tipo entero. Si bien esto no hace cumplir un tipado fuerte en tiempo de ejecución, hace que los tipos esperados sean más claros para otros desarrolladores.

    En conclusión, si bien puede ser tentador tratar de imponer un tipado fuerte en Python, es importante adoptar el enfoque del tipado de pato y centrarse en escribir un código claro y legible. El uso de sugerencias de tipo también puede ayudar a que los tipos esperados sean más claros sin sacrificar la flexibilidad.

Comments are closed.