¿Qué hace que un elemento sea elegible para una prueba de membresía establecida en Python? [duplicar

Esta pregunta ya tiene una respuesta aquí:

¿Cómo / por qué funciona set () en {frozenset ()}? 2 respuestas

Me gustaría saber qué elementos se pueden probar paraset membresía en Python. En general, establecer pruebas de membresía funciona comolist prueba de membresía en Python.

>>> 1 in {1,2,3}
True
>>> 0 in {1,2,3}
False
>>> 

Sin embargo, los conjuntos son diferentes de las listas en que no pueden contener objetos no compartibles, por ejemplo, conjuntos anidados.

Lista, está bien:

>>> [1,2,{1,2}]
[1, 2, {1, 2}]
>>> 

Set, no funciona porque no se puede compartir:

>>> {1,2,{1,2}}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> 

Ahora, incluso si los conjuntos no pueden ser miembros de otros conjuntos, podemos usarlos en pruebas de membresía. Dicha verificación no genera un error.

>>> {1} in {1,2,3}
False
>>> {1,2} in {1,2,3}
False
>>> set() in {1,2,3}
False
>>> 

in embargo, si trato de hacer la misma prueba donde el elemento que se está probando es undict, Aparece un error que sugiere que el elemento que se está probando no puede ser inquebrantable.

>>> {'a':1} in {1,2}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> {} in {1,2}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> 

sa no puede ser toda la historia, porque unaset lat se probará la membresía en otro conjunto, incluso si es inquebrantable, dando un resultado en lugar de un error.

Entonces la pregunta es: ¿Qué hace que un elemento sea elegible para una prueba de membresía establecida en Python?