Wie überprüfe ich, ob der Typ einer Variablen ein String ist?

766

Gibt es eine Möglichkeit zu überprüfen, ob der Typ einer Variablen in Python a ist string, wie:

isinstance(x,int);

für ganzzahlige Werte?

c_pleaseUpvote
quelle
11
Erforderliche Lektüre auf isinstance, wenn Sie Python canonical.org/~kragen/isinstance lernen .
Whaley
Seien Sie vorsichtig mit Ints da isinstance(True, int) is True.
Albert Tugushev
isinstance(x,str)ist in Python 3 korrekt (str ist ein Basistyp).
MasterControlProgram

Antworten:

1139

In Python 2.x würden Sie dies tun

isinstance(s, basestring)

basestringist die abstrakte Oberklasse von strund unicode. Es kann verwendet werden, um zu testen, ob ein Objekt eine Instanz von stroder ist unicode.


In Python 3.x ist der richtige Test

isinstance(s, str)

Die bytesKlasse wird in Python 3 nicht als Zeichenfolgentyp betrachtet.

Sven Marnach
quelle
10
@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:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,
André Fratelli
quelle
4
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 .
Pi Marillion
64

In Python 3.x oder Python 2.7.6

if type(x) == str:
Texom512
quelle
10
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 = 1
if 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')

hoffe das hilft!

F. Taylor
quelle
11

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.

if isinstance(target, str) or isinstance(target, unicode):
Wade Hatler
quelle
1
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
except NameError: # 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

isinstance(myvar, basestring)
umläute
quelle
4
Oder wenn Sie auch Byte-Strings abfangen möchten:basestring = (str, bytes)
Mark Ransom
10

Python 2/3 inklusive Unicode

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html

crizCraig
quelle
1
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.

Für Zeichenfolgen können Sie dies verwenden

type(s) == type('')
Daniil Grankin
quelle
7
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 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return 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.

duanev
quelle
1
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).

yprez
quelle
7

Damit,

Sie haben viele Möglichkeiten, um zu überprüfen, ob Ihre Variable ein String ist oder nicht:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Diese Bestellung ist zweckmäßig.

PatNowak
quelle
5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

gibt True zurück

type(a) in [str, unicode]

gibt True zurück

be_good_do_good
quelle
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)
Cas
quelle
1

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;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");
mPrinC
quelle
1

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.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True
Hassan Mehmood
quelle
-3
s = '123'
issubclass(s.__class__, str)
vadim vaduxa
quelle
-6

So mache ich es:

if type(x) == type(str()):
Benutzer
quelle
4
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.
Martijn Pieters
wenn Typ (x) str ist:
Shaurya Uppal
-7

Ich habe gesehen:

hasattr(s, 'endswith') 
schneller Zahn
quelle
-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
Richard Urban
quelle
2
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.
Vaultah