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: