In alcuni casi, voglio usare callables referentially trasparenti durante la codifica in Python. I miei obiettivi sono di aiutare a gestire la concorrenza, la memoizzazione, il test delle unità e la verifica della correttezza del codice.
Voglio scrivere regole chiare per me e altri sviluppatori da seguire che garantiscano la trasparenza referenziale. Non mi importa che Python non applicherà alcuna regola - ci fidiamo di seguirli. Tieni presente che non modifichiamo mai le funzioni oi metodi in vigore (ad esempio, eseguendo l'hacking nel bytecode).
Ciò che segue ha senso?
A callable object
c
of classC
will be referentially transparent if:
Whenever the returned value of
c(...)
depends on any instance attributes, global variables, or disk files, such attributes, variables, and files must not change for the duration of the program execution; the only exception is that instance attributes may be changed during instance initialization.When
c(...)
is executed, no modifications to the program state occur that may affect the behavior of any object accessed through its "public interface" (as defined by us).
Se non poniamo alcuna restrizione su cosa "interfaccia pubblica" include, la regola n. 2 diventa:
When
c(...)
is executed, no objects are modified that are visible outside the scope ofc.__call__
.
Nota: ho cercato invano di porre questa domanda su SO, ma spero che sia più appropriato per questo sito.