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.