Nuovo nella versione 2.1.
Il modulo weakref permette al programmatore Python di creare riferimenti deboli agli oggetti.
Di seguito, il termine referente indica l'oggetto a cui ci si riferisce con un riferimento debole.
Un riferimento debole a un oggetto non è sufficiente per tenere un oggetto in vita: quando l'unico riferimento restante a un referente è un riferimento debole, la garbage collection è libera di distruggere il referente e riusare la sua memoria per qualche altra cosa. Il principale uso di un riferimento debole è quello di implementare cache o assegnamenti contenenti grandi oggetti, dove è preferibile che un grande oggetto non debba essere tenuto vivo per il solo fatto che appare in una cache o in un assegnamento. Per esempio, se si ha un gran numero di immagini binarie di oggetti, si potrebbe desiderare di associare un nome a ciascuna di esse. Se si utilizza un dizionario Python per assegnare nomi a immagini, o immagini a nomi, gli oggetti immagine potrebbero restare in vita solo perché appaiono come valori o chiavi all'interno dei dizionari. Le classi WeakKeyDictionary e WeakValueDictionary fornite attraverso il modulo weakref rappresentano un'alternativa, usando riferimenti deboli per costruire assegnamenti che non mantengono vivi gli oggetti solo perché essi appaiono in un assegnamento di oggetti. Se, per esempio, un oggetto immagine è un valore in un WeakValueDictionary, quando gli ultimi riferimenti a quell'oggetto immagine sono dei riferimenti deboli mantenuti da assegnamenti deboli, la garbage collection può richiedere l'oggetto, e la sua corrispondente registrazione nella mappa dei riferimenti deboli viene semplicemente cancellata.
WeakKeyDictionary e WeakValueDictionary usano riferimenti deboli nella loro implementazione, impostando una chiamata di ritorno di funzioni sui riferimenti deboli che notificano ai dizionari deboli quando una chiave o un valore viene richiesto dalla garbage collection. Molti programmatori potrebbero verificare che l'uso di uno di questi tipi di dizionari deboli è tutto ciò di cui necessitano - di regola non è necessario creare i propri riferimenti deboli direttamente. L'implementazione di basso livello usata dal dizionario debole viene mostrata dal modulo weakref per beneficiarne negli usi più avanzati.
Non tutti gli oggetti possono venire riferiti debolmente; gli oggetti che godono di questa proprietà sono istanze di classe, funzioni scritte in Python (ma non in C), e metodi (sia diretti che indiretti). Tipi di estensione possono venire facilmente creati per supportare i riferimenti deboli; per ulteriori informazioni vedete la sezione 3.3.3 ``Riferimenti deboli nei tipi di estensione''.
oggetto[, callback]) |
È consentito che riferimenti deboli multipli vengano costruiti intorno allo stesso oggetto. Le chiamate di ritorno registrate per ogni riferimento debole verranno sfruttate in ordine cronologico dalla più recente (cioè da quella registrata per ultima) alla più vecchia (quella registrata per prima).
Le eccezioni sollevate dalla chiamata di ritorno verranno indicate sullo standard error, ma non possono essere propagate; vengono gestite esattamente nella stessa maniera delle eccezioni generate dal metodo __del__() di un oggetto.
I riferimenti deboli sono hashabili se l'oggetto è hashabile. Manterranno il loro valore di hash anche dopo che l'oggetto è stato rimosso. Se la funzione hash() viene chiamata per la prima volta solo dopo che l'oggetto è stato rimosso, la chiamata solleverà un'eccezione TypeError.
I riferimenti deboli supportano i test di uguaglianza, ma non di ordinamento. Se i referenti sono ancora in vita, due riferimenti hanno la stessa relazione di uguaglianza che esiste tra gli oggetti referenti (indipendentemente dalle funzioni di callback). Se entrambi entrambi i referenti vengono cancellati, i riferimenti sono uguali solo se gli oggetti referenti sono lo stesso oggetto.
oggetto[, callback]) |
ProxyType
oppure
CallableProxyType
, a seconda di quale oggetto sia
chiamabile. Gli oggetti proxy non sono hashabili,
indipendentemente dal referente; questo evita una serie di problemi
legati alla loro natura fondamentalmente mutabile, e previene il
loro utilizzo come chiavi dei dizionari. La chiamata di ritorno è la
stessa come il parametro con lo stesso nome dato alla funzione
ref().
oggetto) |
oggetto) |
[dict]) |
Note: Avvertenza: Dal momento che un WeakKeyDictionary viene costruito sopra un dizionario Python, non deve cambiare dimensione quando vengono eseguite delle iterazioni su di esso. Questo può essere difficile da garantire per un WeakKeyDictionary perché le azioni eseguite dal programma durante l'iterazione possono portare alcuni elementi a svanire ``per magia'' (come effetto collaterale della garbage collection).
[dict]) |
Note: Avvertenza: Dal momento che un WeakValueDictionary viene costruito sopra un dizionario Python, non deve cambiare dimensione quando vengono eseguite delle iterazioni su di esso. Questo può essere difficile da garantire per un WeakValueDictionary perché le azioni eseguite dal programma durante l'iterazione possono portare alcuni elementi a svanire ``per magia'' (come effetto collaterale della garbage collection).
Vedete anche: