Ich versuche, eine Typinkongruenz herauszufinden, während ich einer Zeichenfolge in einer Verkettungsoperation eine Zeichenfolge hinzufüge.
Grundsätzlich ist der zurückgegebene Fehler a TypeError
(kann Zeichenfolge und Tupel nicht verketten); Daher möchte ich herausfinden, wo ich einen Wert als Tupel anstelle eines Strings zugewiesen habe.
Alle Werte, die ich zuweise, sind Zeichenfolgen. Ich muss also herausfinden, woher das Tupel kommt. Ich hatte gehofft, dass es in Python eine Möglichkeit gibt, herauszufinden, was in einer Variablen enthalten ist und welcher Typ es ist.
Bisher konnte ich mit pdb den Inhalt der Variablen überprüfen und die erwarteten Werte korrekt erhalten. Ich möchte aber auch den Typ der Variablen kennen (wenn der Compiler logischerweise einen Typfehler auslösen kann, bedeutet dies, dass er weiß, was sich in einer Variablen befindet und ob er mit der auszuführenden Operation kompatibel ist muss ein Weg sein, um diesen Wert / Flag herauszuholen).
Gibt es eine Möglichkeit, den Typ einer Variablen in Python auszudrucken?
Übrigens habe ich versucht, alle meine Variablen so zu ändern, dass sie explizit Zeichenfolgen sind, aber es ist nicht möglich, sie zu erzwingen str (myvar)
. Daher kann ich nicht überall, wo ich Zeichenfolgen verwende, einfach als Zeichenfolgentyp umwandeln.
Antworten:
Sie verwenden nur:
type(varname)
welches int, str, float, etc ausgibt ...
quelle
__class__
ist fast immer besser als die Verwendung,type
da sie in den meisten Situationen dasselbe zurückgeben, außer dasstype
der Typ aller Klassen im alten Stil als "Instanz" deklariert wird. beziehen Sie sich auf diese SO-Fragetype(o)
undo.__class__
immer das gleiche zurückgeben. Die am häufigsten gestellte Antwort in der verknüpften Frage besagt, dass sie nicht vorhanden war, als Sie sie verknüpft haben. Zusätzlichtype
erfordert weniger tippen und sieht aus wie öffentliche API - Funktion (keine Unterstrichen).isinstance(obj, tuple) isinstance(obj, basestring) isinstance(obj, int)
quelle
isinstance nutzen?
if isinstance(var, int): if isinstance(var, str): if isinstance(var, tuple):
quelle
str
schlägt beiunicode
Zeichenfolgen fehl . Außerdemisinstance(var, tuple)
werden alle Variablen übersehen, die zufälliglist
s sind, was in solchen Situationen häufig auftritt. Natürlich möchten Sie möglicherweise einen Fehler machen, wenn die Variable eine Instanz von a istlist
, aber es ist gut sicherzustellen, dass Sie wissen, was in verschiedenen Situationen passieren wird.isinstance(var, (tuple, list))
Bitte beachten Sie, dass das Konstrukt
if type(varname) == "tuple":
nicht funktioniert , wenn Sie Ihren var-Typ in der if-Anweisung einchecken möchten . Aber diese werden:if type(varname) is tuple: if type(varname) is list: if type(varname) is dict: if type(varname) is int: if type(varname) is str:
quelle
Sie möchten wahrscheinlich (unter der Annahme von Python 2.x) mit testen
isinstance(obj, basestring)
. Sie haben die Möglichkeiten der Verwendungisinstance
,type
und rufen Sie das Attribut__class__
, sondernisinstance
ist wahrscheinlich diejenige , die Sie hier haben wollen. In diesem Artikel finden Sie eine ausführlichere Beschreibung der Unterschiede zwischen den drei Optionen.quelle
repr (Objekt) gibt eine Textbeschreibung des Objekts, die Typ und Wert anzeigen sollte. Sie können dies im Debugger drucken oder anzeigen.
Bei einfachen Werten gibt repr normalerweise dieselbe Zeichenfolge zurück, als würden Sie den Wert buchstäblich in Code schreiben. Für benutzerdefinierte Klassen gibt es den Klassennamen und die Objekt-ID oder etwas anderes an, wenn die Klasse es ist
wird überschrieben.
quelle
Um Goujons Antwort zu ergänzen , betrachten Sie diese Liste gemischter Ganzzahlen und Tupel:
for f in fills: print (type(f), f) if type(f)==int : print "INTEGER!!!"
Erzeugt diese Ausgabe:
(<type 'int'>, 0) INTEGER!!! (<type 'tuple'>, (62973, 39058, 25708, 102)) (<type 'int'>, 1) INTEGER!!! (<type 'tuple'>, (16968, 12069, 3329, 102)) (<type 'int'>, 2) INTEGER!!! (<type 'tuple'>, (24939, 62205, 30062, 102)) (<type 'tuple'>, (32911, 32911, 0, 153)) (<type 'tuple'>, (32911, 0, 0, 153)) (<type 'tuple'>, (32911, 0, 32911, 153)) (<type 'tuple'>, (65535, 0, 0, 153)) (<type 'tuple'>, (0, 0, 65535, 153)) (<type 'tuple'>, (0, 32911, 0, 153)) (<type 'tuple'>, (0, 65535, 65535, 153))
Das Geheimnis besteht also nicht darin, auf
"int"
Zeichenfolgen zu testen , sondernint
stattdessen auf Schlüsselwörter. Wenn Sie wie ich sind und aus der Bash-Skriptwelt migrieren, ist die Verwendung von==
Tests in der Python-Skriptwelt wahrscheinlich Ihr erster Schritt.quelle
"
doppelten Anführungszeichen entfernt haben, wird es funktionieren.==
es Leuten wie mir wichtig ist. Ist es jetzt ok?==
anstattis
wenn Sie möchten. Es gibt keinen praktischen Unterschied, außer in sehr seltenen Randfällen, und in diesen Fällenis
ist die richtige Wahl.