@Yarin: Nein. Aber es spielt keine Rolle, da Python 3.x überhaupt nicht mit Python 2.x kompatibel sein soll.
Netcoder
2
Ich habe festgestellt, dass isinstance (s, str) mit py27 funktioniert, getestet unter: Python 2.7.5 (Standard, 25. August 2013, 00:04:04) [GCC 4.2.1-kompatibles Apple LLVM 5.0 (clang-500.0.68)] auf darwin.
Kakyo
25
@kakyo: Das Problem ist, dass unicodeObjekte übersehen werden, die auch als Zeichenfolgen betrachtet werden sollten. Sowohl der Typ strals auch der Typ unicodehaben die gemeinsame Basisklasse basestring, und dies ist, was Sie überprüfen möchten.
Sven Marnach
7
@Yarin Wenn Sie etwas von 2.x nach 3.x portieren, können Sie es jederzeit zuweisen basestring = str.
Jack
9
@AdamErickson Für die Kompatibilität mit was genau? Aus Gründen der Kompatibilität mit Python 3 hilft dies nicht, da es unicodein Python 3 keine gibt . Meine Empfehlung für die Kompatibilität zwischen Python 2 und 3 lautet, die Bibliothek "six" zu verwenden. (Speziell isintance(s, six.string_types)in diesem Fall)
Sven Marnach
222
Ich weiß, dass dies ein altes Thema ist, aber da es das erste ist, das auf Google gezeigt wird, und da ich keine der Antworten zufriedenstellend finde, lasse ich dies hier als zukünftige Referenz:
six ist eine Python 2- und 3-Kompatibilitätsbibliothek, die dieses Problem bereits behandelt. Sie können dann so etwas tun:
import six
if isinstance(value, six.string_types):pass# It's a string !!
Wenn Sie den Code überprüfen, finden Sie Folgendes:
ZB für einen Einzeiler: value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)wobei >=angenommen wird, dass Python 4+ die strStammklasse für Zeichenfolgen behält .
Ich mag die Eleganz von "if type (x) in (str, unicode):", aber ich sehe, dass PyLint es als "unidiomatisch" kennzeichnet.
Eukras
15
Der Vergleich von Typen mit ==wird von PEP8 ausdrücklich nicht empfohlen und hat mehrere Nachteile, die zusätzlich als "unidiomatisch" angesehen werden können, z. B. werden keine Instanzen von Unterklassen von erkannt, strdie ebenfalls als Zeichenfolgen betrachtet werden sollten. Wenn Sie wirklich genau nach dem Typ strsuchen und Unterklassen explizit ausschließen möchten , verwenden Sie type(x) is str.
Sven Marnach
17
du kannst tun:
var =1if type(var)== int:print('your variable is an integer')
oder:
var2 ='this is variable #2'if type(var2)== str:print('your variable is a string')else:print('your variable IS NOT a string')
Guter Fang. Ich wusste nichts über Basestring. Es wird über 3 Beiträge nach unten erwähnt und scheint eine bessere Antwort zu sein.
Wade Hatler
6
isinstance()nimmt auch ein Tupel als zweites Argument. Selbst wenn basestringes nicht existiert, können Sie es einfach verwenden isinstance(target, (str, unicode)).
Martijn Pieters
3
In Python 3.5.1 unicodescheint nicht definiert zu sein:NameError: name 'unicode' is not defined
Eric Hu
11
Da basestringdieser kleine Trick nicht in Python3 definiert ist, kann er dazu beitragen, den Code kompatibel zu machen:
try:# check whether python knows about 'basestring'
basestring
exceptNameError:# no, it doesn't (it's Python3); use 'str' instead
basestring=str
Danach können Sie den folgenden Test sowohl für Python2 als auch für Python3 ausführen
Vielen Dank! Es gibt Dutzende verschiedener Antworten im Internet, aber das einzig Gute ist diese. Die erste Zeile macht type('foo')wurde unicode2 standardmäßig in Python, und die zweite Marke strwobei Instanz unicode. Dies macht den Code in Python 2 und 3 gültig. Nochmals vielen Dank!
Narann
9
Ich möchte auch beachten, dass Sie, wenn Sie überprüfen möchten, ob der Typ einer Variablen eine bestimmte Art ist, den Typ der Variablen mit dem Typ eines bekannten Objekts vergleichen können.
Dies ist eine schreckliche, schreckliche Art, Python einzuchecken. Was ist, wenn eine andere Klasse von erbt str? Was ist mit Unicode-Strings, die strin 2.x nicht einmal erben ? Verwenden Sie isinstance(s, basestring)in 2.x oder isinstance(s, str)in 3.x.
Jack
1
@ Jack, bitte lies die Frage und beachte auch, dass ich nicht schreibe, dass es der beste Weg ist, nur ein anderer Weg.
Daniil Grankin
9
Dies ist aus drei Gründen eine schlechte Idee: isinstance()Erlaubt Unterklassen (die auch Zeichenfolgen sind, nur spezialisiert), der zusätzliche type('')Aufruf ist redundant, wenn Sie nur verwenden können, strund Typen sind Singletons, type(s) is strwas ein effizienterer Test sein wird.
Martijn Pieters
8
Viele gute Vorschläge von anderen hier, aber ich sehe keine gute plattformübergreifende Zusammenfassung. Folgendes sollte für jedes Python-Programm eine gute Einführung sein:
def isstring(s):# if we use Python 3if(sys.version_info[0]>=3):return isinstance(s, str)# we use Python 2return isinstance(s, basestring)
In dieser Funktion überprüfen wir isinstance(object, classinfo), ob unsere Eingabe eine strin Python 3 oder eine basestringin Python 2 ist.
Dies wird wahrscheinlich in Python 4 brechen, >=zumindest in Betracht ziehen .
Thakis
2
Seien Sie sauberer, um nach six.string_types oder six.text_type zu suchen
daonb
@daonb Das Importieren eines gesamten Moduls, nur um einen einzeiligen Test durchzuführen, ist der Gedanke, der dazu führt, dass verrückte Abhängigkeitsbäume und ernsthaftes Aufblähen das ruinieren, was kurz und klein sein sollte. Es ist natürlich Ihr Anruf, aber sagen Sie einfach 'n ...
duanev
@duanev Wenn Sie sich Sorgen über die Kompatibilität mit Python 2/3 machen, ist es besser, sechs im Projekt zu verwenden. Sechs ist auch eine einzelne Datei, daher sind Abhängigkeitsbäume / Aufblähen hier kein Problem.
MoxieBall
7
Alternativer Weg für Python 2 ohne Verwendung von basestring:
isinstance(s,(str, unicode))
Funktioniert aber immer noch nicht in Python 3, da unicodees nicht definiert ist (in Python 3).
Für Python 2.7.12 musste ich die Anführungszeichen entfernen: Geben Sie (a) in [str, unicode] ein
Adam Erickson
4
Hier ist meine Antwort, um sowohl Python 2 als auch Python 3 zusammen mit diesen Anforderungen zu unterstützen:
Geschrieben in Py3-Code mit minimalem Py2-Kompatibilitätscode.
Entfernen Sie den Py2-Kompatibilitätscode später ohne Unterbrechung. Dh nur das Löschen anstreben, keine Änderung des Py3-Codes.
Vermeiden Sie die Verwendung eines sixähnlichen kompatiblen Moduls, da diese dazu neigen, das zu verbergen, was erreicht werden soll.
Zukunftssicher für ein potenzielles Py4.
import sys
PY2 = sys.version_info.major ==2# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else(str, bytes))# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)
Wenn Sie nicht auf externe Bibliotheken angewiesen sein möchten, funktioniert dies sowohl für Python 2.7+ als auch für Python 3 ( http://ideone.com/uB4Kdc ):
# your code goes here
s =["test"];#s = "test";
isString =False;if(isinstance(s, str)):
isString =True;try:if(isinstance(s, basestring)):
isString =True;exceptNameError:pass;if(isString):print("String");else:print("Not String");
Sie können einfach die Verwendung isinstance Funktion , um sicherzustellen , dass die Eingangsdaten von Format - String oder Unicode . Die folgenden Beispiele sollen Ihnen das Verständnis erleichtern.
type(str())ist eine sehr umständliche Art zu sagen str. Typen sind Singletons, daher type(x) is strist es effizienter. isinstance()sollte stattdessen verwendet werden, es sei denn, Sie haben sehr gute Gründe, Unterklassen von zu ignorieren str.
In welchem Fall würden Sie lieber type(thing).__name__ == 'str'als type(thing) == stroder isinstance(thing, str)? Auch unicodein modernen Versionen von Python nicht vorhanden.
isinstance(True, int) is True
.isinstance(x,str)
ist in Python 3 korrekt (str ist ein Basistyp).Antworten:
In Python 2.x würden Sie dies tun
basestring
ist die abstrakte Oberklasse vonstr
undunicode
. Es kann verwendet werden, um zu testen, ob ein Objekt eine Instanz vonstr
oder istunicode
.In Python 3.x ist der richtige Test
Die
bytes
Klasse wird in Python 3 nicht als Zeichenfolgentyp betrachtet.quelle
unicode
Objekte übersehen werden, die auch als Zeichenfolgen betrachtet werden sollten. Sowohl der Typstr
als auch der Typunicode
haben die gemeinsame Basisklassebasestring
, und dies ist, was Sie überprüfen möchten.basestring = str
.unicode
in Python 3 keine gibt . Meine Empfehlung für die Kompatibilität zwischen Python 2 und 3 lautet, die Bibliothek "six" zu verwenden. (Speziellisintance(s, six.string_types)
in diesem Fall)Ich weiß, dass dies ein altes Thema ist, aber da es das erste ist, das auf Google gezeigt wird, und da ich keine der Antworten zufriedenstellend finde, lasse ich dies hier als zukünftige Referenz:
six ist eine Python 2- und 3-Kompatibilitätsbibliothek, die dieses Problem bereits behandelt. Sie können dann so etwas tun:
Wenn Sie den Code überprüfen, finden Sie Folgendes:
quelle
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
wobei>=
angenommen wird, dass Python 4+ diestr
Stammklasse für Zeichenfolgen behält .In Python 3.x oder Python 2.7.6
quelle
==
wird von PEP8 ausdrücklich nicht empfohlen und hat mehrere Nachteile, die zusätzlich als "unidiomatisch" angesehen werden können, z. B. werden keine Instanzen von Unterklassen von erkannt,str
die ebenfalls als Zeichenfolgen betrachtet werden sollten. Wenn Sie wirklich genau nach dem Typstr
suchen und Unterklassen explizit ausschließen möchten , verwenden Sietype(x) is str
.du kannst tun:
oder:
hoffe das hilft!
quelle
Das Typmodul ist auch vorhanden, wenn Sie mehr als Ints und Strings prüfen. http://docs.python.org/library/types.html
quelle
types.StringTypes
.Bearbeiten Sie basierend auf der besseren Antwort unten. Gehen Sie ungefähr 3 Antworten durch und finden Sie heraus, wie kühl Basestring ist.
Alte Antwort: Achten Sie auf Unicode-Zeichenfolgen, die Sie an verschiedenen Stellen abrufen können, einschließlich aller COM-Aufrufe in Windows.
quelle
isinstance()
nimmt auch ein Tupel als zweites Argument. Selbst wennbasestring
es nicht existiert, können Sie es einfach verwendenisinstance(target, (str, unicode))
.unicode
scheint nicht definiert zu sein:NameError: name 'unicode' is not defined
Da
basestring
dieser kleine Trick nicht in Python3 definiert ist, kann er dazu beitragen, den Code kompatibel zu machen:Danach können Sie den folgenden Test sowohl für Python2 als auch für Python3 ausführen
quelle
basestring = (str, bytes)
Python 2/3 inklusive Unicode
http://python-future.org/overview.html
quelle
type('foo')
wurdeunicode
2 standardmäßig in Python, und die zweite Markestr
wobei Instanzunicode
. Dies macht den Code in Python 2 und 3 gültig. Nochmals vielen Dank!Ich möchte auch beachten, dass Sie, wenn Sie überprüfen möchten, ob der Typ einer Variablen eine bestimmte Art ist, den Typ der Variablen mit dem Typ eines bekannten Objekts vergleichen können.
Für Zeichenfolgen können Sie dies verwenden
quelle
str
? Was ist mit Unicode-Strings, diestr
in 2.x nicht einmal erben ? Verwenden Sieisinstance(s, basestring)
in 2.x oderisinstance(s, str)
in 3.x.isinstance()
Erlaubt Unterklassen (die auch Zeichenfolgen sind, nur spezialisiert), der zusätzlichetype('')
Aufruf ist redundant, wenn Sie nur verwenden können,str
und Typen sind Singletons,type(s) is str
was ein effizienterer Test sein wird.Viele gute Vorschläge von anderen hier, aber ich sehe keine gute plattformübergreifende Zusammenfassung. Folgendes sollte für jedes Python-Programm eine gute Einführung sein:
In dieser Funktion überprüfen wir
isinstance(object, classinfo)
, ob unsere Eingabe einestr
in Python 3 oder einebasestring
in Python 2 ist.quelle
>=
zumindest in Betracht ziehen .Alternativer Weg für Python 2 ohne Verwendung von basestring:
Funktioniert aber immer noch nicht in Python 3, da
unicode
es nicht definiert ist (in Python 3).quelle
Damit,
Sie haben viele Möglichkeiten, um zu überprüfen, ob Ihre Variable ein String ist oder nicht:
Diese Bestellung ist zweckmäßig.
quelle
gibt True zurück
gibt True zurück
quelle
Hier ist meine Antwort, um sowohl Python 2 als auch Python 3 zusammen mit diesen Anforderungen zu unterstützen:
six
ähnlichen kompatiblen Moduls, da diese dazu neigen, das zu verbergen, was erreicht werden soll.quelle
Wenn Sie nicht auf externe Bibliotheken angewiesen sein möchten, funktioniert dies sowohl für Python 2.7+ als auch für Python 3 ( http://ideone.com/uB4Kdc ):
quelle
Sie können einfach die Verwendung isinstance Funktion , um sicherzustellen , dass die Eingangsdaten von Format - String oder Unicode . Die folgenden Beispiele sollen Ihnen das Verständnis erleichtern.
quelle
quelle
So mache ich es:
quelle
type(str())
ist eine sehr umständliche Art zu sagenstr
. Typen sind Singletons, dahertype(x) is str
ist es effizienter.isinstance()
sollte stattdessen verwendet werden, es sei denn, Sie haben sehr gute Gründe, Unterklassen von zu ignorierenstr
.Ich habe gesehen:
quelle
quelle
type(thing).__name__ == 'str'
alstype(thing) == str
oderisinstance(thing, str)
? Auchunicode
in modernen Versionen von Python nicht vorhanden.