Ich bin mir bewusst, dass ich Folgendes verwenden kann: isinstance(x, str)
in Python-3.x, aber ich muss auch überprüfen, ob etwas in Python-2.x eine Zeichenfolge ist. Funktioniert es isinstance(x, str)
wie erwartet in Python-2.x? Oder muss ich die Version überprüfen und verwenden isinstance(x, basestr)
?
Insbesondere in Python-2.x:
>>>isinstance(u"test", str)
False
und Python-3.x hat nicht u"foo"
python
string
python-3.x
python-2.x
Randall Hunt
quelle
quelle
Antworten:
Wenn Sie 2.x- und 3.x-kompatiblen Code schreiben, möchten Sie wahrscheinlich sechs verwenden :
quelle
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Ich hatte erwartet, dass isinstance (u "foo", string_types) false zurückgibt.str
undunicode
auf Python 2 oderstr
auf Python 3. Wenn Sie nicht wollen ,unicode
auf Python 2 zählen, nur verwendenstr
.future
Paket verwenden, anstattsix
:from future.utils import string_types
Der knappste Ansatz, den ich gefunden habe, ohne mich auf Pakete wie sechs zu verlassen, ist:
Angenommen, Sie haben in Python 2 auf die allgemeinste Weise nach Zeichenfolgen gesucht.
funktioniert jetzt auch für Python 3+.
quelle
basestring = (str, bytes)
vonrequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
Was ist damit, funktioniert in allen Fällen?
quelle
from __future__ import unicode_literals
aktiv bin . Jetzt gehe ich mit:isinstance(val, (str, u"".__class__))
Dies ist die Antwort von @Lev Levitsky, die ein wenig umgeschrieben wurde.
Der
try
/except
test wird einmal durchgeführt und definiert dann eine Funktion, die immer funktioniert und so schnell wie möglich ist.EDIT: Eigentlich müssen wir nicht einmal anrufen
isinstance()
; wir müssen nur bewertenbasestring
und sehen, ob wir eine bekommenNameError
:Ich denke, es ist jedoch einfacher, dem Anruf zu folgen
isinstance()
.quelle
isinstance("", basestring)
ist das, was ich mit "anrufen" gemeint habe. Wie auch immer, +1.try: string_types = basestring except NameError: string_types = str
Die
future
Bibliothek fügt (zu Python 2) kompatible Namen hinzu , sodass Sie Python 3 weiter schreiben können . Sie können einfach Folgendes tun:Um es zu installieren , führen Sie es einfach aus
pip install future
.Als Einschränkung , unterstützt es nur
python>=2.6
,>=3.3
aber es ist moderner alssix
, die nur bei Verwendung empfohlenpython 2.5
quelle
Verwenden Sie möglicherweise eine Problemumgehung wie
quelle
isinstance(u'hello', basestr)
RenditenSyntaxError: invalid syntax
für mich mit Python 3.2.3 unter Windows 7 .. eine Idee , warum dies wäre? Es scheint nicht zu gefallenu
- ich bekomme diesen Fehler mitstr
undbasestr
str
Python3 per Definition Unicode ist. Dementsprechend gibt es keinenbasestring
Typ, daher derNameError
, der in meinem Snippet gefangen ist.try
/except
test ein einziges Mal durchzuführen, und basierend auf den Ergebnissen dieses einzelnen Tests definieren Sie ihnisstr()
korrekt. Es ist nicht erforderlich, bei jedem Aufruf von den Overhead einer Ausnahme zu verursachenisstr()
.Sie können die Klasse eines Objekts durch Aufrufen abrufen
object.__class__
, um zu überprüfen, ob das Objekt der Standardzeichenfolgentyp ist:Und Sie können Folgendes oben in Ihren Code einfügen, sodass in Anführungszeichen eingeschlossene Zeichenfolgen in Python 2 in Unicode sind:
quelle
some_element.text
ist ein 'str', aber der Vergleich mit 'unicode' würde fehlschlagenSie können dies am Anfang Ihres Codes versuchen:
und später im Code:
quelle
Achtung! In Python 2
str
undbytes
sind im Wesentlichen gleich. Dies kann einen Fehler verursachen, wenn Sie versuchen, zwischen den beiden zu unterscheiden.quelle
Typ (Zeichenfolge) == Str
Gibt true zurück, wenn es sich um eine Zeichenfolge handelt, und false, wenn nicht
quelle
string
eine Unicode-Zeichenfolge ist