Sto lavorando a uno strumento che trarrebbe vantaggio dalla possibilità di tenere traccia di tutti i riferimenti a un determinato oggetto all'interno di python.Da python, possiamo tenere traccia delle assegnazioni a livello di modulo prima che venga eseguito (altro) il codice utente?
In particolare, mi piacerebbe creare un sistema di test double che possa sostituire tutti gli attributi a livello di modulo di un determinato tipo. Si supponga ad esempio il seguente codice nel modulo c:
from a import b
Se a è un modulo, b è un riferimento all'oggetto denominato a.b, ma è un separato riferimento . Se il mio doppio sistema di test successivamente sostituisce a.b, c.b farà comunque riferimento all'oggetto originale.
Mi piacerebbe che il mio strumento tenesse traccia di tutti i compiti di a.b in alias, ma l'aliasing a livello di modulo farebbe molto per raggiungere il mio obiettivo.
Metaforicamente, quello che vorrei è quello di ignorare Module.__setattribute__
:
def __setattribute__(self, name, value):
if isinstance(value, interesting_types):
# remember this use of the interesting object and call super for normal processing.
Si supponga che posso ottenere il mio codice caricato prima di moduli che possono essere monitorati possono essere caricati.
Mi è venuto in mente che potrei essere in grado di utilizzare un importatore per fare il trucco, perché una volta importato (con i metodi normali), ho potuto ispezionare gli attributi dell'oggetto restituito e tracciarlo.Approfondirò questo approccio. –
Probabilmente mi manca qualcosa ... 'da un'importazione b' crea un nuovo' b' nell'attuale scope che è diverso da 'a.b'. Se assegni un valore a 'b', non cambia il valore di' a.b'. Perchè vuoi fare questo? – Seth
Sono interessato a puntare tutti i riferimenti all'originale b a un'altra implementazione di b. Nello specifico, sto cercando di costruire un sistema di test double che ti permetta di sostituire tutti i riferimenti alla normale implementazione con spionaggio, finto, stub o finto. –