Si es solo heurístico para su almacenamiento en caché, simplemente use lo que funcione. isinstance (x, str), por ejemplo, casi exactamente como ahora. (Dado que desee para decidir si la caché o no; una prueba falsa de soporte sólo significa una pérdida de caché, no se hace nada malo.)
(Observación: Resulta que los objetos tampón son hashable , aunque su representación de cadena puede cambiar bajo sus pies;. la discusión de hash a continuación es interesante, pero no es la solución pura que estaba destinado a ser)
sin embargo, las clases bien implementados deben tener instancias siendo hashable si son inmutables y no si son mutables. Una prueba general sería analizar su objeto y probar el éxito.
>>> hash({})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: dict objects are unhashable
Esto dará falsos positivos, estoy seguro, pero los objetos mutables que se pueden manipular son estrictamente un salto de interfaz; Me esperar tipos biblioteca de Python a obedecer esta interfaz, una prueba de una pequeña muestra da respuestas correctas:
hashabe: str (Immutable), buffer (Warning, immutable slice of (possibly) mutable object!)
unhashable: list, array.array
me gustaría recomendar que reformular su título de la pregunta. Por definición, las cadenas (instancias 'str') en Python son ** nunca ** mutables. Los objetos tipo cadena pueden ser, sin embargo. –
Esto no responde a su pregunta, así que lo estoy publicando como comentario: debe usar isinstance (s, basetring) en lugar de comparar el tipo, por lo que no desaproba las clases derivadas y unicode. En Python 3, use isinstance (s, str). –
¿Qué estás haciendo si el argumento es mutable? – bstpierre