Wie bestimme ich den Typ einer Python-Variablen?


Antworten:


1380

Verwenden Sie die type()eingebaute Funktion:

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

Verwenden Sie Folgendes, um zu überprüfen, ob eine Variable von einem bestimmten Typ ist isinstance:

>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False

Beachten Sie, dass Python nicht die gleichen Typen wie C / C ++ hat, was Ihre Frage zu sein scheint.


437

Möglicherweise suchen Sie nach der integrierten Funktion .type()

Sehen Sie sich die folgenden Beispiele an, aber es gibt in Python keinen "vorzeichenlosen" Typ wie in Java.

Positive ganze Zahl:

>>> v = 10
>>> type(v)
<type 'int'>

Große positive ganze Zahl:

>>> v = 100000000000000
>>> type(v)
<type 'long'>

Negative Ganzzahl:

>>> v = -10
>>> type(v)
<type 'int'>

Wörtliche Zeichenfolge:

>>> v = 'hi'
>>> type(v)
<type 'str'>

Gleitkomma-Ganzzahl:

>>> v = 3.14159
>>> type(v)
<type 'float'>

Ich musste doppelt nehmen, als ich das sah. Java SE8 enthält jetzt vorzeichenlose Ganzzahlen, und ich habe so viel damit entwickelt, dass es sündhaft erscheint, dass Java vor SE8 noch nie vorzeichenlose Ganzzahlen hatte.
dddJewelsbbb

172

Es ist so einfach. Du machst es so.

print(type(variable_name))

110

Wie bestimme ich den Variablentyp in Python?

Wenn Sie also eine Variable haben, zum Beispiel:

one = 1

Sie möchten den Typ kennen?

Es gibt richtige und falsche Wege, um fast alles in Python zu tun. Hier ist der richtige Weg:

Verwenden type

>>> type(one)
<type 'int'>

Sie können das __name__Attribut verwenden, um den Namen des Objekts abzurufen. (Dies ist eines der wenigen speziellen Attribute, für deren Zugriff Sie den __dunder__Namen verwenden müssen. Im inspectModul gibt es nicht einmal eine Methode dafür .)

>>> type(one).__name__
'int'

Nicht benutzen __class__

In Python sind Namen, die mit Unterstrichen beginnen, semantisch nicht Teil der öffentlichen API, und es wird empfohlen, dass Benutzer sie nicht verwenden. (Außer wenn es absolut notwendig ist.)

Da typewir die Klasse des Objekts erhalten, sollten wir vermeiden, dies direkt zu erhalten. ::

>>> one.__class__

Dies ist normalerweise die erste Idee, die Menschen beim Zugriff auf den Typ eines Objekts in einer Methode haben - sie suchen bereits nach Attributen, daher scheint der Typ seltsam. Zum Beispiel:

class Foo(object):
    def foo(self):
        self.__class__

Tu es nicht. Geben Sie stattdessen (self) ein:

class Foo(object):
    def foo(self):
        type(self)

Implementierungsdetails von Ints und Floats

Wie sehe ich den Typ einer Variablen, ob sie vorzeichenlos 32 Bit, vorzeichenlos 16 Bit usw. ist?

In Python sind diese Details Implementierungsdetails. Im Allgemeinen machen wir uns in Python normalerweise keine Sorgen darüber. Um Ihre Neugier zu stillen ...

In Python 2 ist int normalerweise eine vorzeichenbehaftete Ganzzahl, die der Wortbreite der Implementierung entspricht (vom System begrenzt). Es wird normalerweise als Long in C implementiert . Wenn Ganzzahlen größer werden, konvertieren wir sie normalerweise in Python-Longs (mit unbegrenzter Genauigkeit, nicht zu verwechseln mit C-Longs).

In einem 32-Bit-Python 2 können wir beispielsweise ableiten, dass int eine vorzeichenbehaftete 32-Bit-Ganzzahl ist:

>>> import sys

>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'

In Python 3 verschwindet das alte int, und wir verwenden nur (Pythons), solange int int eine unbegrenzte Genauigkeit hat.

Wir können auch einige Informationen über Pythons Floats erhalten, die normalerweise als Double in C implementiert sind :

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, 
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

Fazit

Verwenden Sie keine __class__semantisch nicht öffentliche API, um den Typ einer Variablen abzurufen. Verwenden Sie typestattdessen.

Machen Sie sich nicht zu viele Gedanken über die Implementierungsdetails von Python. Ich musste mich nicht selbst mit Problemen befassen. Sie werden es wahrscheinlich auch nicht tun, und wenn Sie es wirklich tun, sollten Sie genug wissen, um nicht auf diese Antwort zu schauen, was zu tun ist.


Typ kommt heraus als gibt <type instance>aber - was mache ich falsch? __class__email.message.Message
Jasen

@Jasen Verwenden Sie Python 2 und erben nicht von object?
Aaron Hall

Ja, import email ich benutze nur keine Klassen meiner eigenen Erfindung.
Jasen

65
print type(variable_name)

Ich empfehle auch den interaktiven IPython- Interpreter, wenn Sie sich mit Fragen wie diesen befassen. Sie können variable_name?damit eine ganze Liste mit Informationen zum Objekt eingeben, einschließlich des Typs und der Dokumentzeichenfolge für den Typ.

z.B

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

Konvertieren Sie nach Möglichkeit eine Zeichenfolge oder Zahl in eine Ganzzahl. Ein Gleitkomma-Argument wird gegen Null abgeschnitten (dies beinhaltet keine Zeichenfolgendarstellung einer Gleitkommazahl!). Verwenden Sie beim Konvertieren einer Zeichenfolge die optionale Basis. Es ist ein Fehler, beim Konvertieren eines Nicht-Strings eine Basis anzugeben. Wenn das Argument außerhalb des ganzzahligen Bereichs liegt, wird stattdessen ein langes Objekt zurückgegeben.


2
Ich bat um unsigned int, signierte int etc
user46646

3
print type(str)gibt einen Fehler in Python 3.6 zurück. Verwenden Sietype(str)
Kolob Canyon

4
@ KolobCanyon, weil in 3.x, Druck braucht Klammern:print(type(str))
jcoppens

1
Sie sollten den print type(var)fehlerhaften Code wirklich ändern .
Han XIAO

54
a = "cool"
type(a)

//result 'str'
<class 'str'>
or 
do 
`dir(a)` 
to see the list of inbuilt methods you can have on the variable.

40

Ein weiterer Weg mit __class__:

>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>

1
re: comment "Namen, die mit Unterstrichen beginnen ..." (einfache) Unterstriche unterscheiden sich stark von doppelten Unterstrichen ("Dunders") und sind definitiv Teil der öffentlichen API, und es ist auf jeden Fall in Ordnung, sie zu verwenden. Dies kann hilfreich sein ... youtu.be/wf-BqAjZb8M
michael

31

Beispiele für die einfache Typprüfung in Python:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

29

Es kann wenig irrelevant sein. Sie können jedoch die Objekttypen isinstance(object, type)wie hier beschrieben überprüfen .


1
Ich denke, diese ist viel besser als die Typfunktion, die beim Überprüfen verwendet wird. Wenn Sie überprüfen und mit dem Ergebnis handeln möchten, müssen Sie try catch with type verwenden, aber isinstance gibt true oder false zurück
alkanschtein

24

Die Frage ist etwas mehrdeutig - ich bin mir nicht sicher, was Sie unter "Ansicht" verstehen. Wenn Sie versuchen , Abfrage der Art eines nativen Python - Objekt, @atzz ‚s Antwort wird Sie in die richtige Richtung zu lenken.

Allerdings, wenn Sie versuchen , zu erzeugen Python - Objekte , die die Semantik der ursprünglichen C-Typen haben, (wie zum Beispiel uint32_t, int16_t), verwenden Sie das structModul. Sie können die Anzahl der Bits in einem bestimmten Grundelement vom Typ C folgendermaßen bestimmen:

>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4

Dies spiegelt sich auch im arrayModul wider , das Arrays dieser untergeordneten Typen erstellen kann:

>>> array.array('c').itemsize # char
1

Die maximal unterstützte Ganzzahl (Python 2 int) wird von sys.maxint angegeben .

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

Es gibt auch sys.getsizeof , das die tatsächliche Größe des Python- Objekts im Restspeicher zurückgibt :

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

Verwenden Sie für Float-Daten und Präzisionsdaten sys.float_info :

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

7
Die Frage, so wie ich es verstehe, fragt nach dem Abfragen des Typs einer "Variablen" in Python. Ihre Antwort ist im Allgemeinen richtig, aber nicht zum Thema gehörend.
tzot

19

Meinst du in Python oder mit ctypes ?

Im ersten Fall können Sie dies einfach nicht - da Python keine vorzeichenbehafteten / vorzeichenlosen 16/32-Bit-Ganzzahlen hat.

Im zweiten Fall können Sie verwenden type():

>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>

Weitere Informationen zu ctypes und seinem Typ finden Sie in der offiziellen Dokumentation .


15

Python hat keine solchen Typen, wie Sie sie beschreiben. Es gibt zwei Typen, die zur Darstellung von Integralwerten verwendet werden: intDies entspricht dem Int-Typ der Plattform in C und longist eine Ganzzahl mit beliebiger Genauigkeit (dh sie wächst nach Bedarf und hat keine Obergrenze). ints werden stillschweigend konvertiert, longwenn ein Ausdruck ein Ergebnis erzeugt, in dem nicht gespeichert werden kann int.


11

Einfach, für Python 3.4 und höher

print (type(variable_name))

Python 2.7 und höher

print type(variable_name)

10

Es kommt wirklich darauf an, welches Level du meinst. In Python 2.x gibt es aus historischen Gründen zwei Ganzzahltypen int(beschränkt auf sys.maxint) und long(unbegrenzte Genauigkeit). Im Python-Code sollte dies keinen Unterschied machen, da der Interpreter automatisch zu lang konvertiert, wenn eine Zahl zu groß ist. Wenn Sie wissen möchten, welche Datentypen im zugrunde liegenden Interpreter tatsächlich verwendet werden, hängt dies von der Implementierung ab. (CPythons befinden sich in Objects / intobject.c und Objects / longobject.c.) Informationen zu den Systemtypen finden Sie unter cdleary answer für die Verwendung des struct-Moduls.


7

Verwenden Sie für python2.x

print type(variable_name)

Verwenden Sie für python3.x

print(type(variable_name))

-29

Mach es einfach nicht. Nach etwas zu fragen ist an sich falsch. Verwenden Sie stattdessen Polymorphismus. Finden oder definieren Sie bei Bedarf selbst die Methode, die für jede mögliche Art von Eingabe das tut, was Sie wollen, und rufen Sie sie einfach auf, ohne nach etwas zu fragen. Wenn Sie mit integrierten Typen oder Typen arbeiten müssen, die von einer Bibliothek eines Drittanbieters definiert wurden, können Sie jederzeit von diesen erben und stattdessen Ihre eigenen Derivate verwenden. Oder Sie können sie in Ihre eigene Klasse einwickeln. Dies ist der objektorientierte Weg, um solche Probleme zu lösen.

Wenn Sie darauf bestehen, den genauen Typ zu überprüfen und ifhier und da einige schmutzige s zu platzieren, können Sie die __class__Eigenschaft oder typeFunktion verwenden, um dies zu tun. In Kürze werden Sie jedoch alle diese ifs alle zwei oder drei Commits mit zusätzlichen Fällen aktualisieren . Wenn Sie dies auf OO-Weise tun, wird dies verhindert, und Sie können stattdessen nur eine neue Klasse für einen neuen Eingabetyp definieren.


4
Ich weiß nicht wirklich, was diese Antwort zu den vorhandenen hinzugefügt hat (vielleicht über den ersten Satz hinaus?)
user2305193
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.