Wenn es nur eine Heuristik für Ihre Zwischenspeicherung ist, verwenden Sie einfach, was auch immer funktioniert. isinstance (x, str), zum Beispiel, fast genau wie jetzt. (Given wollen Sie entscheiden, ob oder nicht cachen, einen Falsch-Lagertest bedeutet nur eine Cache-Miss, Sie nichts falsch gemacht.)
(Anmerkung: Es stellt sich heraus, dass Puffer Objekte hashable sind , obwohl ihre String-Darstellung unter den Füßen kann sich ändern;. die Hash-Diskussion unten interessant ist, ist aber nicht die reine Lösung beabsichtigt wurde, zu sein)
jedoch gut umgesetzt Klassen sollten Instanzen hashable zu sein, wenn sie sind unveränderlich und nicht, wenn sie veränderbar sind. Ein allgemeiner Test wäre, Ihr Objekt zu hacken und auf Erfolg zu prüfen.
>>> hash({})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: dict objects are unhashable
Dies wird falsche positive Ergebnisse geben, bin ich sicher, aber veränderbare Objekte, die hashable sind, sind streng genommen eine Unterbrechung der Schnittstelle; Ich würde Python-Bibliothek Typen erwarten, dass diese Schnittstelle zu gehorchen, ein Test einer kleinen Probe gibt die richtigen Antworten:
hashabe: str (Immutable), buffer (Warning, immutable slice of (possibly) mutable object!)
unhashable: list, array.array
ich Sie Ihre Frage Titel umformulieren würde empfehlen. Per Definition sind Strings ('str'-Instanzen) in Python ** niemals ** änderbar. String-ähnliche Objekte können jedoch sein. –
Dies beantwortet Ihre Frage nicht, daher poste ich sie als Kommentar: Sie sollten isinstance (s, basestring) anstelle des Typs type verwenden, damit Sie abgeleitete Klassen und Unicode nicht verbieten. Verwenden Sie in Python 3 isinstance (s, str). –
Was machst du, wenn das Argument veränderbar ist? – bstpierre