La filosofia di come utilizzare diversi oggetti in un programma Python si chiama digitazione anatra -se sembra un'anatra, ciarlatana come anatra, e cammina come un'anatra, è un'anatra. Gli oggetti non sono raggruppati in base al loro tipo ma a ciò che sono in grado di fare, e questo si estende anche alle funzioni. Quando scrivi un programma Python, dovresti sempre sapere cosa possono fare tutti gli oggetti e usarli senza controllo.
Ad esempio, ho potuto definire una funzione
def add_three(a, b c):
return a + b + c
e significare per essere utilizzato con tre galleggianti. Ma non controllando questo, ho una funzione molto più utile: posso usarla con ints, con decimal.Decimals, o con fractions.Fractions, per esempio.
Lo stesso vale per avere una funzione. Se so di avere una funzione e voglio chiamarla, dovrei semplicemente chiamarla. Forse quello che ho è una funzione e forse ho un altro callable (come un metodo associato o un'istanza di una classe arbitraria che definisce __call__
) che potrebbe essere altrettanto buono. Non controllando nulla, faccio in modo che il mio codice sia in grado di gestire una vasta gamma di circostanze che non avrei nemmeno potuto pensare in anticipo.
Nel caso delle callebles, posso determinare in modo affidabile se ne possiedo una o meno, ma per la semplicità del mio codice, non dovrei volerlo. Se qualcuno passa in qualcosa che non è chiamabile, riceverai un errore quando lo chiami comunque. Se sto scrivendo un codice che accetta un parametro che può essere un callable o meno e faccio cose diverse a seconda di esso, sembra che dovrei migliorare la mia API definendo due funzioni per fare queste due cose diverse.
Se si dispone di un modo per gestire il caso in cui il chiamante ha inoltrato qualcosa che non è simile alla funzione (e questo non era solo il risultato di un'API folle), la soluzione giusta sarebbe prendere il TypeError
che viene generato quando si tenta di chiamare qualcosa che non può essere chiamato. In generale, è meglio provare a fare qualcosa e recuperare se fallisce piuttosto che controllare in anticipo. (Ricorda il cliché, "È più facile chiedere perdono che il permesso.") Controllare in anticipo può portare a problemi imprevisti basati su sottili errori di logica e può portare a condizioni di gara.
Perché pensi di aver bisogno di tipografare?
Vuoi che ritorni vero anche per le classi, dal momento che sono richiamabili? – Javier
La soluzione migliore è smettere di volerlo fare. –
Cosa ti impedisce di leggere il codice? –