Grundsätzlich möchte ich das machen:
obj = 'str'
type ( obj ) == string
Ich habe es versucht:
type ( obj ) == type ( string )
und es hat nicht funktioniert.
Und was ist mit den anderen Typen? Zum Beispiel konnte ich nicht replizieren NoneType
.
type(obj) == str
Antworten:
In Ihrem Fall
isinstance("this is a string", str)
wird zurückkehrenTrue
.Vielleicht möchten Sie auch Folgendes lesen: http://www.canonical.org/~kragen/isinstance/
quelle
isinstance
funktioniert:Aber denken Sie daran: Wenn es wie eine Ente aussieht und wenn es wie eine Ente klingt, ist es eine Ente.
BEARBEITEN: Für den Typ Keine können Sie einfach Folgendes tun:
quelle
def distance_from_zero(n): if isinstance(n,int) or isinstance(n,float): return abs(n) else: return "Nope" print distance_from_zero(True)
Dies gibt eine "1" anstelle von "Nope" zurück. Wie kann man das umgehen?isinstance
aber auch prüfen, funktioniertNone
dannisinstance(obj, (MyClass, type(None)))
.types.NoneType
wurde aus Python 3 entfernt, daher ist es nicht so portabel, alstype(None)
dass ein Verweis darauf abgerufen werden könnteNoneType
.Vermeiden Sie zunächst alle Typvergleiche. Sie sind sehr, sehr selten notwendig. Manchmal helfen sie dabei, Parametertypen in einer Funktion zu überprüfen - auch das ist selten. Falsche Typdaten lösen eine Ausnahme aus, und das ist alles, was Sie jemals brauchen werden.
Alle grundlegenden Konvertierungsfunktionen werden der Typfunktion gleich zugeordnet.
Es gibt noch einige andere Fälle.
Übrigens braucht keiner diese Art der Typprüfung. None ist die einzige Instanz von NoneType. Das None-Objekt ist ein Singleton. Überprüfen Sie einfach auf Keine
Übrigens, verwenden Sie die oben genannten im Allgemeinen nicht. Verwenden Sie gewöhnliche Ausnahmen und Pythons eigenen natürlichen Polymorphismus.
quelle
NoneType
. Was passiert , wenn ein Parameter kann eine seinstr
,unicode
oderNone
?isinstance(x, (str, unicode, types.NoneType))
ist viel sauberer als zu überprüfenNone
. Wenn Sie Tools für verzögerte Berechnungen erstellen oder einen langen oder ressourcenintensiven Prozess starten möchten, ist es hilfreich,type
Fehler während eines benutzerdefinierten Validierungsschritts im Voraus zu erkennen. Dies war ein wichtiger Bestandteil fast aller wissenschaftlichen Computerprojekte, an denen ich jemals gearbeitet habe. Von allen Entwicklungsprojekten, die ich gesehen habe, haben mehr dies benötigt als nicht.Weitere Typen finden Sie im Modul Typen :
PS Typechecking ist eine schlechte Idee.
quelle
Sie können immer den
type(x) == type(y)
Trick verwenden, woy
etwas mit bekanntem Typ ist.Oft gibt es dafür bessere Möglichkeiten, insbesondere bei neueren Pythons. Aber wenn Sie sich nur an eine Sache erinnern wollen, können Sie sich daran erinnern.
In diesem Fall wären die besseren Möglichkeiten:
Beachten Sie den letzten Fall: Es gibt nur eine Instanz von
NoneType
in Python, und das istNone
. Sie werden NoneType häufig in Ausnahmen sehen (TypeError: 'NoneType' object is unsubscriptable
- passiert mir die ganze Zeit ..), aber Sie müssen kaum jemals im Code darauf verweisen.Wie Fengshaun betont, ist die Typprüfung in Python nicht immer eine gute Idee. Es ist pythonischer, den Wert einfach so zu verwenden, als wäre er der erwartete Typ, und die daraus resultierenden Ausnahmen abzufangen (oder zu verbreiten).
quelle
Du bist sehr nah!
string
ist ein Modul, kein Typ. Sie möchten wahrscheinlich den Typ vonobj
mit dem Typobjekt für Zeichenfolgen vergleichen, nämlichstr
:Alternative:
Beachten Sie, dass in Python 2, wenn
obj
es sich um einen Unicode-Typ handelt, keines der oben genannten Verfahren funktioniert. Auch nichtisinstance()
. In Johns Kommentaren zu diesem Beitrag erfahren Sie, wie Sie das umgehen können ... Ich habe seit ungefähr 10 Minuten versucht, mich daran zu erinnern, hatte aber einen Speicherblock!quelle
Es ist, weil Sie schreiben müssen
Typ akzeptiert eine Instanz und gibt ihren Typ zurück. In diesem Fall müssen Sie die Typen zweier Instanzen vergleichen.
Wenn Sie eine vorbeugende Prüfung durchführen müssen, ist es besser, wenn Sie nach einer unterstützten Schnittstelle suchen als nach dem Typ.
Der Typ sagt nicht wirklich viel aus, abgesehen von der Tatsache, dass Ihr Code eine Instanz eines bestimmten Typs möchte, unabhängig davon, dass Sie eine andere Instanz eines völlig anderen Typs haben könnten, was vollkommen in Ordnung wäre, da es dieselbe Schnittstelle implementiert .
Angenommen, Sie haben diesen Code
Angenommen, Sie sagen: Ich möchte, dass dieser Code nur ein Tupel akzeptiert.
Dies verringert die Wiederverwendbarkeit dieser Routine. Es funktioniert nicht, wenn Sie eine Liste, einen String oder ein numpy.array übergeben. Etwas besseres wäre
Aber es macht keinen Sinn, dies zu tun: Parameter [0] löst eine Ausnahme aus, wenn das Protokoll ohnehin nicht erfüllt ist ... dies natürlich, es sei denn, Sie möchten Nebenwirkungen verhindern oder müssen sich von Aufrufen erholen, die Sie aufrufen könnten, bevor Sie fehlschlagen. (Dummes) Beispiel, nur um den Punkt zu machen:
In diesem Fall löst Ihr Code eine Ausnahme aus, bevor der system () -Aufruf ausgeführt wird. Ohne Schnittstellenprüfungen hätten Sie die Datei entfernt und dann die Ausnahme ausgelöst.
quelle
Verwenden Sie str anstelle von string
Erläuterung
quelle
ich benutze
type(x) == type(y)
Wenn ich zum Beispiel etwas überprüfen möchte, handelt es sich um ein Array:
Zeichenfolgenprüfung:
Wenn Sie gegen Keine prüfen möchten, verwenden Sie
quelle
Ich denke, das sollte es tun
quelle
Typ funktioniert in bestimmten Klassen nicht. Wenn Sie sich über den Objekttyp nicht sicher sind, verwenden Sie die folgende
__class__
Methode:Siehe auch diesen Artikel - http://www.siafoo.net/article/56
quelle
Verwenden Sie das
__class__
Element wie in, um den Typ abzurufenunknown_thing.__class__
Die Rede vom Ententippen ist hier nutzlos, weil es keine vollkommen gute Frage beantwortet. In meinem Anwendungscode muss ich nie den Typ von etwas kennen, aber es ist immer noch nützlich, eine Möglichkeit zu haben, den Typ eines Objekts zu lernen. Manchmal muss ich die tatsächliche Klasse erhalten, um einen Komponententest zu validieren. Die Eingabe von Enten wird dort behindert, da alle möglichen Objekte dieselbe API haben, aber nur eines korrekt ist. Außerdem pflege ich manchmal den Code eines anderen und habe keine Ahnung, welche Art von Objekt mir übergeben wurde. Dies ist mein größtes Problem mit dynamisch getippten Sprachen wie Python. Version 1 ist sehr einfach und schnell zu entwickeln. Version 2 ist ein Problem, besonders wenn Sie Version 1 nicht geschrieben haben. Wenn ich also mit einer Funktion arbeite, die ich nicht geschrieben habe, muss ich manchmal den Typ eines Parameters kennen.
Hier bietet sich der
__class__
Parameter an. Dies ist (soweit ich das beurteilen kann) der beste (vielleicht einzige) Weg, um den Typ eines Objekts zu ermitteln.quelle
Verwenden Sie
isinstance(object, type)
. Wie oben ist dies einfach zu verwenden, wenn Sie das richtige kennentype
, z.Bei esoterischeren Objekten kann dies jedoch schwierig zu verwenden sein. Beispielsweise:
Aber Sie können diesen Trick machen:
Daher empfehle ich, eine Variable (
y
in diesem Fall) mit einem Typ des Objekts zu instanziieren, das Sie überprüfen möchten (z. B.type(np.array())
), und dann zu verwendenisinstance
.quelle
Sie können Klassen für die Prüfstufe vergleichen.
quelle