Python pasante para no cuerdas

¿Por qué el intern de Python está integrado solo para cuerdas? Debería ser posible extender el intern a clases que sean hashable y comparables, ¿verdad?

El propósito de internar cosas es poder compararlos comparando su dirección de memoria; garantiza que nunca cree dos objetos con el mismo valor (cuando el progtwig solicita la creación de un segundo objeto con el mismo valor que un objeto existente, en su lugar recibe una referencia al objeto preexistente). Esto requiere que las cosas que estás internando sean inmutables ; Si el valor de un objeto internado puede cambiar, compararlos por dirección no va a funcionar.

En Python, no es posible imponer la inmutabilidad de las instancias de clase definidas por el usuario, por lo que no sería seguro internarlos. Sospecho que esa es la principal razón teórica que los internos no cubren las instancias de clase.

Otros tipos inmutables incorporados ya son comparables en una sola operación a nivel de máquina (int, flotante, etc.) o contenedores inmutables que pueden contener valores mutables (tupla, frozenset). No hay necesidad de internar a los primeros, y los últimos tampoco pueden ser internados de manera segura.

No hay una razón técnica para que, por ejemplo, una tupla no pueda ser internada, aunque me imagino que en el mundo real esto tiene poco valor en comparación con los literales de cadena, y sería incluso menos valioso en el mundo real con los definidos por el usuario. tipos Hacer que funcione probablemente no valga la pena el esfuerzo.

Solo se admiten cadenas porque la internación se basa en una prueba de identidad de objetos basada en punteros. Los hash de otros tipos de clases podrían compararse, pero los objetos en sí mismos nunca coincidirán con una prueba de identidad. Esto es cierto porque aunque pueden ser idénticos, no son los mismos objetos.

Referencia