Wie finde ich heraus, ob ein Python-Objekt ein String ist?

Wie kann ich überprüfen, ob ein Python-Objekt ein String ist (entweder normal oder Unicode)?

13 Solutions collect form web for “Wie finde ich heraus, ob ein Python-Objekt ein String ist?”

Python 2

Verwenden Sie isinstance(obj, basestring) für ein Objekt-to-Test obj .

Docs

Um zu prüfen, ob ein Objekt o ein String-Typ einer Unterklasse eines String-Typs ist:

 isinstance(o, basestring) 

Denn sowohl str als auch unicode sind Unterklassen von basestring .

Um zu prüfen, ob die Art von o genau genau ist:

 type(o) is str 

Um zu prüfen, ob o eine Instanz von str oder eine beliebige Unterklasse von str :

 isinstance(o, str) 

Die oben genannten auch für Unicode-Strings, wenn Sie str mit unicode ersetzen.

Allerdings müssen Sie nicht explizite Typprüfung überhaupt durchführen. "Duck typing" kann Ihren Bedürfnissen entsprechen. Siehe http://docs.python.org/glossary.html#term-duck-typing .

Siehe auch Was ist der kanonische Weg, um nach Typ in Python zu überprüfen?

Python 3

In Python 3.x basestring ist nicht mehr verfügbar, da str der einzige String-Typ ist (mit der Semantik von Python 2.x's unicode ).

Also der Check in Python 3.x ist nur:

 isinstance(obj_to_test, str) 

Dies folgt dem Fix des offiziellen 2to3 Umwandlungstools: Umwandlung von basestring in str .

Python 2 und 3

(Kreuzverträglich)

Wenn du ohne Rücksicht auf Python-Version (2.x vs 3.x) überprüfen willst, benutzt man six ( PyPI ) und das Attribut string_types :

 import six if isinstance(obj, six.string_types): print('obj is a string!') 

Innerhalb von six (ein sehr leichtes Single-File-Modul) macht es einfach das:

 import sys PY3 = sys.version_info[0] == 3 if PY3: string_types = str, else: string_types = basestring, 

Ich fand das noch mehr pythonisch:

 if type(aObject) is str: #do your stuff here pass 

Da Typobjekte Singleton sind, kann man den Vergleich verwenden

Ich könnte damit im Duck-Typing-Stil umgehen, wie andere erwähnen. Woher weiß ich, dass ein String wirklich ein String ist? Gut, offensichtlich durch die Umwandlung in einen String!

 def myfunc(word): word = unicode(word) ... 

Wenn das arg bereits ein String- oder Unicode-Typ ist, wird real_word seinen Wert unverändert beibehalten. Wenn das übergebene Objekt eine __unicode__ Methode implementiert, wird das verwendet, um seine Unicode-Darstellung zu erhalten. Wenn das übergebene Objekt nicht als String verwendet werden kann, hebt das unicode Buildin eine Ausnahme an.

Um zu überprüfen, ob deine Variable etwas ist, könnte man wie:

 s='Hello World' if isinstance(s,str): #do something here, 

Die Ausgabe von isistance gibt dir einen booleschen True oder False Wert, so dass du dich entsprechend einstellen kannst. Sie können die erwartete Abkürzung Ihres Wertes überprüfen, indem Sie zunächst: type (s) verwenden. Hiermit geben Sie 'str' ein, damit Sie es in der isistance-Funktion verwenden können.

 isinstance(your_object, basestring) 

Wird wahr sein wenn dein Objekt tatsächlich ein String-Typ ist. "Str" ist reserviertes Wort.

Meine Entschuldigung, die richtige Antwort ist die Verwendung von 'basestring' anstelle von 'str', um auch Unicode-Strings einzuschließen – wie oben von einem der anderen Responder angemerkt wurde.

Wenn man von der expliziten Typprüfung abbleiben will (und es gibt gute Gründe, sich davon abzuhalten), ist wohl der sicherste Teil des String-Protokolls zu überprüfen:

 str(maybe_string) == maybe_string 

Es wird nicht durch eine iterable oder Iterator iterieren, wird es nicht eine Liste der Zeichenfolgen eine Zeichenfolge und es korrekt erkennt eine Zeichenfolge wie eine Zeichenfolge.

Natürlich gibt es Nachteile. Zum Beispiel kann str(maybe_string) eine schwere Berechnung sein. Wie oft, die Antwort ist es hängt ab

Sie können es testen, indem Sie mit einem leeren String verknüpfen:

 def is_string(s): try: s += '' except: return False return True 

Bearbeiten :

Korrigieren meine Antwort nach Kommentaren, die darauf hinweisen, dass dies mit Listen fehlschlägt

 def is_string(s): return isinstance(s, basestring) 

Heute abend lief ich in eine Situation, in der ich dachte, ich würde mich gegen den str Typ überprüfen müssen, aber es stellte sich heraus, dass ich es nicht getan habe.

Mein Ansatz zur Lösung des Problems wird wahrscheinlich in vielen Situationen funktionieren, also biete ich es unten an, wenn andere, die diese Frage lesen, interessiert sind (nur Python 3).

 # NOTE: fields is an object that COULD be any number of things, including: # - a single string-like object # - a string-like object that needs to be converted to a sequence of # string-like objects at some separator, sep # - a sequence of string-like objects def getfields(*fields, sep=' ', validator=lambda f: True): '''Take a field sequence definition and yield from a validated field sequence. Accepts a string, a string with separators, or a sequence of strings''' if fields: try: # single unpack in the case of a single argument fieldseq, = fields try: # convert to string sequence if string fieldseq = fieldseq.split(sep) except AttributeError: # not a string; assume other iterable pass except ValueError: # not a single argument and not a string fieldseq = fields invalid_fields = [field for field in fieldseq if not validator(field)] if invalid_fields: raise ValueError('One or more field names is invalid:\n' '{!r}'.format(invalid_fields)) else: raise ValueError('No fields were provided') try: yield from fieldseq except TypeError as e: raise ValueError('Single field argument must be a string' 'or an interable') from e 

Einige Tests:

 from . import getfields def test_getfields_novalidation(): result = ['a', 'b'] assert list(getfields('a b')) = result assert list(getfields('a,b', sep=',')) = result assert list(getfields('a', 'b')) = result assert list(getfields(['a', 'b'])) = result 

Für einen schönen Enten-Typing-Ansatz für String-Likes, die den Bonus der Arbeit mit Python 2.x und 3.x hat:

 def is_string(obj): try: obj + '' return True except TypeError: return False 

Wisefish war in der Nähe der Enten-Typisierung, bevor er auf den isinstance Ansatz wechselte, außer dass += eine andere Bedeutung für Listen als + hat.

 if type(varA) == str or type(varB) == str: print 'string involved' 

Von EDX – Online-Kurs MITx: 6.00.1x Einführung in die Informatik und Programmierung mit Python

  • Python-Summe, warum nicht Strings?
  • Pandas: Datentyp der Spalten ändern
  • Testen Sie, ob eine Variable eine Liste oder ein Tupel ist
  • Typ Hinweis in Python 2
  • Wie man mit Ctypes auf Funktionen zurückkehrt, die benutzerdefinierte Typen zurückgeben, die in einer Delphi-DLL codiert sind?
  • Was ist ein guter Weg, um etwas Ähnliches zu einer Schnittstelle in Python zu implementieren?
  • Typ Hinting: Argument der Typklasse
  • Überprüfen, ob Pfad eine Steckdose in Python 2.7 ist
  • Was sind die Vorteile (und Nachteile) einer schwach typisierten Sprache?
  • Datentypfehler
  • Custom Wrapper für die Indexierung der Python-Liste ab 1
  • Python ist die beste Programmiersprache der Welt.