A purefunction è una funzione simile a una funzione matematica, in cui non vi è alcuna interazione con il "mondo reale" né effetti collaterali. Da un punto di vista più pratico, ciò significa che una funzione puro può non:Come verificare se una funzione è pura in Python?
- Stampa o comunque mostrare un messaggio
- essere casuale
- dipendono dal tempo del sistema
- modificare le variabili globali
- E altri
Tutte queste limitazioni rendono più facile ragionare sulla funzione pura s di quelli non puri. La maggior parte delle funzioni dovrebbe quindi essere pura in modo che il programma possa avere meno bug.
In lingue con un enorme sistema di tipi come Haskell il lettore può sapere fin dall'inizio se una funzione è o non è pura, rendendo più facile la lettura successiva.
In Python questa informazione può essere emulata da un decoratore @pure
messo sopra la funzione. Mi piacerebbe anche che il decoratore eseguisse effettivamente dei lavori di validazione. Il mio problema sta nell'implementazione di un decoratore di questo tipo.
In questo momento guardo semplicemente il codice sorgente della funzione per parole chiave come global
o random
o print
e si lamenta se ne trova uno.
import inspect
def pure(function):
source = inspect.getsource(function)
for non_pure_indicator in ('random', 'time', 'input', 'print', 'global'):
if non_pure_indicator in source:
raise ValueError("The function {} is not pure as it uses `{}`".format(
function.__name__, non_pure_indicator))
return function
Tuttavia ci si sente come un hack strano, che può o non può funzionare a seconda della fortuna, la prego di aiutarmi a scrivere un decoratore di meglio?
Si potrebbe 'inspect.getsource' quindi' ast.parse' e si cammina con i nodi per controllare varie cose ... ma si andrebbe contro il motivo per cui esiste la lingua - guarda usando il modulo 'abc' se vuoi roba, quindi 'isinstance' controlla dove devono essere ... - python è ** fortemente ** digitato - non ** staticamente ** digitato –
@JonClements i linguaggi dinamici di fatto eseguono meno verifiche in fase di compilazione, ma penso che sia un controllo particolare migliorerebbe notevolmente l'organizzazione del programma e controllerebbe di nuovo la comprensione del proprio lavoro da parte dei programmatori. – Caridorc
Quindi usa un linguaggio tipizzato staticamente ... :) Puoi vederlo come una cosa * male * o * buona * ... ma è così che è –