5.14.3 Protocollo per la conversione automatica in oggetti immutabili

Gli insiemi possono contenere soltanto elementi immutabili. Per comodità, gli oggetti Set mutabili vengono automaticamente copiati in ImmutableSet prima di essere inseriti come elementi di un insieme.

Il meccanismo è quello di aggiungere sempre un elemento hashable o, se non è hashable, si controlla se possieda un metodo __as_immutable__() che restituisca un oggetto immutabile equivalente.

Poiché gli oggetti Set possiedono un metodo __as_immutable__() che restituisce un'istanza di ImmutableSet, è possibile costruire insiemi di insiemi.

Un meccanismo simile viene richiesto dai metodi __contains__() e remove() che richiedono di applicare la funzione di hash su un elemento per controllare se è presente in un insieme. Questi metodi controllano se è possibile applicare la funzione di hash su un elemento, se non è possibile, controllano la presenza del metodo __as_temporarily_immutable__() il quale restituisce l'elemento incapsulato in una classe che fornisce metodi temporanei __hash__(), __eq__() e __ne__().

Questo metodo alternativo risparmia la necessità di costruire una copia separata dell'oggetto mutabile originale.

Gli oggetti Set implementano il metodo __as_temporarily_immutable__() il quale restituisce l'oggetto Set incapsulato in una nuova classe _TemporarilyImmutableSet.

I due meccanismi per aggiungere la possibilità di calcolare il valore di hash in genere sono invisibili all'utente; tuttavia possono sorgere dei conflitti negli ambienti multi-thread in cui un thread può modificare un insieme mentre un altro lo ha temporaneamente incapsulato in _TemporarilyImmutableSet. In altre parole gli insiemi composti da insiemi mutabili non sono sicuri per i thread.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.