La filosofía de cómo utilizar diferentes objetos en un programa de Python se llama pato escribir -si es que parece un pato, grazna como pato y camina como un pato, es un pato. Los objetos se agrupan no por su tipo, sino por lo que son capaces de hacer, y esto incluso se extiende a las funciones. Al escribir un programa de Python, siempre debe saber qué pueden hacer todos sus objetos y usarlos sin verificar.
Por ejemplo, podría definir una función
def add_three(a, b c):
return a + b + c
y significar para que sea utilizado con tres flotadores. Pero al no comprobar esto, tengo una función mucho más útil: puedo usarla con enteros, con decimales decimales o fracciones. Por ejemplo, fracciones.
Lo mismo se aplica a tener una función. Si sé que tengo una función y quiero llamarla, debería llamarla. Tal vez lo que tengo es una función y tal vez tengo una llamada diferente (como un método vinculado o una instancia de una clase arbitraria que define __call__
) que podría ser igual de buena. Al no verificar nada, hago que mi código sea capaz de manejar una amplia gama de circunstancias que tal vez ni siquiera había pensado con antelación.
En el caso de los callables, puedo determinar bastante confiablemente si tengo uno o no, pero por el bien de la simplicidad de mi código, no me gustaría. Si alguien transfiere algo que no se puede llamar, recibirá un error cuando lo llame de todos modos. Si estoy escribiendo código que acepta un parámetro que puede ser invocable o no y hago diferentes cosas dependiendo de él, parece que debería mejorar mi API definiendo dos funciones para hacer estas dos cosas diferentes.
Si tenía una manera de manejar el caso donde la persona que llama pasó algo que no funciona (y esto no fue solo el resultado de una API demente), la solución correcta sería atrapar el TypeError
que se genera cuando intentas llamar a algo que no se puede invocar. En general, es mejor tratar de hacer algo y recuperar si falla en lugar de verificarlo con anticipación. (Recuerde el cliché: "Es más fácil pedir perdón que permiso".) Controlar con anticipación puede generar problemas inesperados basados en errores sutiles en la lógica y puede conducir a condiciones de carrera.
¿Por qué crees que necesitas tipear?
¿Desea que también sea cierto para las clases, ya que están habilitadas? – Javier
La mejor solución es dejar de querer hacer esto. –
¿Qué le impide leer el código? –