miércoles, 9 de enero de 2019

T4. CALLABLE: SI TÚ ME DICES 'VEN'...

FLORACIÓN DE LOS DURAZNEROS SOBRE LA FUENTITA, POR ENCIMA DEL VALLE DE SAN LORENZO, ARONA, SUROESTE DE TENERIFE.


      ¿Nos hemos peguntado alguna vez por qué nos ponen un nombre cuando nacemos? Entre otras razones posibles, una de las más útiles es para identificarnos, volvernos 'singulares', entre el resto de nuestra propia especie. Así podríamos decir:  "!María Jesús! ¡Acércate a casa de la abuela a ver si necesita algo!" o "¡Carlos Manuel! ¡Átate las cuerdas de los zapatos antes de salir!".
De este modo, María Jesús  (y sólo María Jesús entre todos los demás) sabe que debe subir ala casa de la abuela por si necesita alguna cosa, y Carlos Manuel (y sólo Carlos Manuel entre todos los demás) deberá atarse los cordones de sus bonitos zapatos negros de piel antes de salir a la calle.
¿Y cómo saben María Jesús y Carlos Manuel que deben hacer estas tareas? Porque ambos tiene un nombre propio que los singulariza, los distingue de los demás y los vuelve únicos  en su "especie". Por este nombre podemos LLAMARLOS → CALLABLE.
He aquí la magia: si tienes un nombre te puedo llamar (eres callable) y pedirte que ejecutes la acción que sabes hacer: si eres Manolo, el panadero, "Manolo, amasa y calienta el pan"; si eres Marisa, la costurera, "Marisa, arréglame las vueltas de la falda para este sábado"; etc.
Ahora, si no tienes nombre, no te puedo llamar (no eres callable)... y te conviertes un cero a la izquierda.
Con esto podemos decir que un objeto Python es callable si tiene nombre (un nombre propio, claro). ¿Y qué objetos tiene un nombre propio en Python, bien porque se lo impongamos nosotros mismos, bien porque se lo proporcione el propio léxico del lenguaje? Pues las funciones, bien definidas por el usuario (se lo imponemos nosotros), bien nativas o built-in (se los impone el propio léxico del lenguaje); las clases, a las que nosotros mismos ponemos nombre, como veremos en su momento; y las instancias (objetos) derivadas de las clases.
Sin embargo, no son callable las variables por muy bonito que le hayamos elegido el nombre. ¿Por qué no son callable cuando, en realidad, sí que tienen un nombre (podemos llamar a una variable en cualquier momento de la ejecución del código, y tantas veces como queramos, para que nos devuelva el valor almacenado en ese momento 'current value') y que, además, las singulariza entre el resto de variables: num = 7, playerName_1 = "Santiago", listasúper = ["leche", "huevos", "aceite", "pan"]? La clave de la respuesta está en lo que hemos mencionado más arriba: llamamos a María Jesús, Carlos Manuel, a Manolo o a Marisa para que hagan algo, para que funcionen, mientras que las variables sólo apuntan a espacios de memoria donde almacenar el dato/valor que se les ha asignado.



En Python, resumiendo, se dice que un objeto es callable, esto es, que se lo puede llamar o invocar cuando dicho objeto puede llamarse como función. En Python no llamamos a un datatype a través de la variable que referencia a un espacio de memoria donde éste se almacena (int, float, string, list, tuple, bytearray, etc.) por lo que ninguno de estos es callable. En Python sólo se puede llamar (es callable) a una función, a una clase o a una instancia de clase. Y nada más.
Ésta es la razón de ser de la función nativa callable() que nos avisa a través de un booleano, True o False, si un objeto es una función, una clase o una instancia de clase y, en consecuencia, puede ser llamado como tal o no, como podemos comprobar en el ejemplo superior: en el primer caso, devuelve True y en el segundo, False.

      AUNQUE NO SE SUELE REPARAR EN ELLO, TAMBIÉN SON callable LAS EXCEPCIONES EN PYTHON, TANTO LAS NATIVAS COMO LAS DEFINIDAS POR NOSOTROS MISMOS, EN TANTO QUE SUBCLASES (CLASES HEREDADAS) DE LA CLASE BaseException. COMO PODEMOS IMAGINAR, EL OBJETO None, EN TANTO QUE  "NINGUNA COSA", NO ES callable.



Bajo esta tesitura, cualquier función integrada de Python es, técnicamente, tal y como hemos dicho, callable, y su paso como argumento de la función callable() devolverá siempre True.



Tengamos en cuenta que la función callable() se aplica a los elementos que forma parte de un bloque de código, ya que no sirve para establecer a priori si a un objeto se le puede aplicar tal función o no. Podemos comprobarlo a continuación:



La función callable() tampoco es aplicable a variables a las que se les haya asignado una función. Recordemos: la función callable() sólo devolverá True si el nombre que le pasamos como argumento se corresponde con el de una función "de pleno derecho", como tal, y no de un espacio de memoria donde pueda quedar alojada.



Si la variable almacena una función sólo con su nombre (sin los paréntesis o zona de parámetros y, en consecuencia, inoperante) sí devuelve True. Tanto callable() como type() son funciones nativas de tipo informativo, controlador, capaces, por ejemplo, de suscitar una bifurcación en el transcurso de la ejecución de un código en función de lo que devuelvan, pero que no desempeñan, digamos, una función "operativa", como len(secuencia) o abs(int). Como ya se ha mencionado antes, la función callable() ejerce tan sólo una actividad informativa y de control, para saber si una variable x es una función, y, consecuentemente, si se trata de un objeto invocable o no:
ADVERTENCIA: no fijarse en las cosas "raras" como @property, class, ... Quedémonos, de momento, sólo con la idea.



ESCORRENTÍA Y CAIDERO DE AGUA ANEGANDO UNA POCETA NATURAL DURANTE LAS LLUVIAS DE INVIERNO EN LOS BARRANCOS DEL SUR DE TENERIFE.

       EL MÉTODO ESPECIAL __call__():

      
     Una cuestión muy importante a tener en cuenta es que la función callable() no es una función exacta, es decir, que aún cuando la función devuelva True, la llamada en sí todavía puede fallar aunque, por el contrario, cuando devuelve False, con toda seguridad, no podremos llamar al objeto.
En su momento, aunque en el ejemplo superior tenemos un atisbo de esto, veremos que las clases (class) son callable. Y cada vez que llamamos a una clase obtenemos una instancia (de la clase) que, a su vez, es callable, eso sí, siempre y cuando recurramos al método especial __call__().


ANTIGUAS TAJEAS DE BLOQUE DE TOBA (O PIEDRA PÓMEZ, PUMITA)ENTRE PINARES  PARA CANALIZAR EL AGUA DESDE LOS ALTOS DE IFONCHE, EN VILAFLOR, A LOS CAMPOS DE CULTIVO EN TORNO A LA VILLA HOMÓNIMA, SUR DE TENERIFE.