Wie kann ich überprüfen, ob ein Python-Objekt eine Zeichenfolge ist (entweder regulär oder Unicode)?
python
string
types
compatibility
Matt S.
quelle
quelle
Antworten:
Python 2
Verwenden Sie
isinstance(obj, basestring)
für ein zu testendes Objektobj
.Docs .
quelle
Python 2
So überprüfen Sie, ob ein Objekt
o
ein Zeichenfolgentyp einer Unterklasse eines Zeichenfolgentyps ist:weil beide
str
undunicode
Unterklassen von sindbasestring
.So überprüfen Sie, ob der Typ
o
genau iststr
:So überprüfen Sie, ob
o
es sich um eine Instanzstr
oder eine Unterklasse vonstr
:Die oben auch Arbeit für Unicode - Strings , wenn Sie ersetzen
str
mitunicode
.Möglicherweise müssen Sie jedoch überhaupt keine explizite Typprüfung durchführen. "Duck Typing" kann Ihren Bedürfnissen entsprechen. Siehe http://docs.python.org/glossary.html#term-duck-typing .
Siehe auch Wie kann kanonisch nach Python gesucht werden?
quelle
basestring
in py2 nachsehen.Python 3
In Python 3.x
basestring
ist nicht mehr verfügbar, ebensostr
wie der einzige Zeichenfolgentyp (mit der Semantik von Python 2.xunicode
).Die Prüfung in Python 3.x lautet also nur:
Dies folgt dem Fix des offiziellen
2to3
Konvertierungstools: Konvertierenbasestring
instr
.quelle
Python 2 und 3
(kreuzkompatibel)
Wenn Sie ohne Berücksichtigung der Python-Version (2.x vs 3.x) prüfen möchten, verwenden Sie
six
( PyPI ) und seinstring_types
Attribut:Innerhalb
six
(eines sehr leichten Einzeldateimoduls) geschieht dies einfach wie folgt :quelle
future
( PyPI ) verwenden, um sogar den Namen zu behalten:from past.builtins import basestring
basestring
und greifen Sie dann auf zurückstr
. ZBdef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Ich fand das und mehr
pythonic
:da Objekte vom Typ Singleton sind, wird verwendet werden , die zu vergleichen , um das Objekt zu dem str Typen zu tun
quelle
isinstance(obj_to_test, str)
ist offensichtlich zum Testen des Typs gedacht und hat den Vorteil, dass das gleiche Verfahren wie für andere Fälle ohne Str angewendet wird.Wenn Sie sich von expliziten Typprüfungen fernhalten möchten (und es gibt gute Gründe, sich davon fernzuhalten), ist der wahrscheinlich sicherste Teil des zu überprüfenden Zeichenfolgenprotokolls:
Es wird nicht durch eine Iteration oder einen Iterator iteriert, es wird keine Liste von Zeichenfolgen als Zeichenfolge bezeichnet und es erkennt eine Zeichenfolge wie eine Zeichenfolge korrekt .
Natürlich gibt es Nachteile. Zum Beispiel
str(maybe_string)
kann eine schwere Berechnung sein. Wie so oft ist die Antwort, dass es darauf ankommt .BEARBEITEN : Wie @Tcll in den Kommentaren hervorhebt , fragt die Frage tatsächlich nach einer Möglichkeit, sowohl Unicode-Zeichenfolgen als auch Bytestrings zu erkennen. In Python 2
False
schlägt diese Antwort mit Ausnahme von Unicode-Zeichenfolgen fehl, die Nicht-ASCII-Zeichen enthalten, und in Python 3 wird sie für alle Bytestrings zurückgegeben.quelle
b = b'test'; r = str(b) == b
Dabei werdenb
dieselben Daten gespeichert wiestr(b)
bei (als Byte-Objekt) jedoch nicht als Zeichenfolge validiert.Um zu überprüfen, ob Ihre Variable etwas ist, können Sie folgendermaßen vorgehen:
Die Ausgabe von isistance gibt Ihnen einen booleschen True- oder False-Wert, damit Sie ihn entsprechend anpassen können. Sie können das erwartete Akronym Ihres Werts überprüfen, indem Sie zunächst Folgendes verwenden: type (s) Dies gibt Ihnen den Typ 'str' zurück, damit Sie es in der isistance-Funktion verwenden können.
quelle
Ich könnte damit im Enten-Schreibstil umgehen, wie andere erwähnen. Woher weiß ich, dass eine Zeichenfolge wirklich eine Zeichenfolge ist? Nun, offensichtlich durch Konvertieren in einen String!
Wenn das Argument bereits ein String- oder Unicode-Typ ist, behält real_word seinen Wert unverändert bei. Wenn das übergebene Objekt eine
__unicode__
Methode implementiert , wird diese verwendet, um die Unicode-Darstellung abzurufen. Wenn das übergebene Objekt nicht als Zeichenfolge verwendet werden kann,unicode
löst das integrierte Objekt eine Ausnahme aus.quelle
wird wahr sein, wenn Ihr Objekt tatsächlich ein Zeichenfolgentyp ist. 'str' ist ein reserviertes Wort.
Ich entschuldige mich, die richtige Antwort ist, "basestring" anstelle von "str" zu verwenden, um auch Unicode-Strings einzuschließen - wie oben von einem der anderen Responder erwähnt.
quelle
Heute Abend bin ich in eine Situation geraten, in der ich dachte, ich müsste mich gegen den
str
Typ erkundigen, aber es stellte sich heraus, dass ich es nicht tat.Mein Ansatz zur Lösung des Problems wird wahrscheinlich in vielen Situationen funktionieren. Daher biete ich ihn unten an, falls andere, die diese Frage lesen, interessiert sind (nur Python 3).
Einige Tests:
quelle
Verwenden Sie einfach den folgenden Code (wir nehmen an, dass das erwähnte Objekt obj ist) -
quelle
Sie können es testen, indem Sie es mit einer leeren Zeichenfolge verketten:
Bearbeiten :
Korrektur meiner Antwort nach Kommentaren, die darauf hinweisen, dass dies bei Listen fehlschlägt
quelle
Für einen netten Ententypisierungsansatz für String-Likes, der den Vorteil hat, sowohl mit Python 2.x als auch mit 3.x zu arbeiten:
Wisefish war eng mit der Ententypisierung verbunden, bevor er zum
isinstance
Ansatz überging , außer dass dies+=
für Listen eine andere Bedeutung hat als dies der+
Fall ist.quelle
isalpha
, aber wer weiß, nach welchen Methoden man sicher suchen kann?__str__
Methode plus Gleichheit tatsächlich die narrensichere sein kann. Aber auch das ist nicht ohne Einschränkungen.try
kann schneller sein. Wenn Sie es 99% der Zeit erwarten, vielleicht nicht. Da der Leistungsunterschied minimal ist, ist es besser, idiomatisch zu sein, es sei denn, Sie profilieren Ihren Code und identifizieren ihn als tatsächlich langsam.from EDX - Online-Kurs MITx: 6.00.1x Einführung in die Informatik und Programmierung mit Python
quelle
str
!