Frage Wie ermittelt man den Typ einer Python-Variablen?


Wie sehe ich den Typ einer Variablen, ob es 32 Bit ohne Vorzeichen, 16 Bit mit Vorzeichen usw. ist?

Wie sehe ich es?


1031
2017-12-31 07:58


Ursprung


Antworten:


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

Versuche dies:

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

Der Unterschied zwischen int und long geht jedoch in Python 3.0 verloren.


948
2017-12-31 10:43



Du suchst vielleicht nach dem type() Funktion.

Siehe die folgenden Beispiele, aber es gibt in Python keinen "unsigned" -Typ wie Java.

Positive ganze Zahl:

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

Groß positive ganze Zahl:

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

Negative Ganzzahl:

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

Buchstabenfolge:

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

Gleitkommazahl:

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

306
2017-10-01 11:02



Es ist so einfach. Du machst es so.

print(type(variable_name))

133
2017-10-07 16:02



Wie bestimmt man den Variablentyp in Python?

Wenn Sie also eine Variable haben, zum Beispiel:

one = 1

Sie möchten seinen Typ wissen?

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

Benutzen type

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

Du kannst den ... benutzen __name__ Attribut, um den Namen des Objekts zu erhalten. (Dies ist eines der wenigen speziellen Attribute, das Sie verwenden müssen __dunder__ Name zu erreichen - es gibt nicht einmal eine Methode dafür inspect Modul.)

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

Benutze es nicht __class__

In Python sind Namen, die mit Unterstrichen beginnen, semantisch nicht Teil der öffentlichen API, und es ist eine bewährte Methode für Benutzer, sie nicht zu verwenden. (Außer wenn absolut notwendig.)

Schon seit type gibt uns die Klasse des Objekts, wir sollten vermeiden, dies direkt zu bekommen. :

>>> one.__class__

Dies ist normalerweise die erste Idee, die Menschen haben, wenn sie auf den Typ eines Objekts in einer Methode zugreifen - sie suchen bereits nach Attributen, so dass Typ seltsam erscheint. Beispielsweise:

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

Nicht. Geben Sie stattdessen (selbst) Folgendes ein:

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

Implementierungsdetails von Ints und Floats

Wie sehe ich den Typ einer Variablen, ob es 32 Bit ohne Vorzeichen, 16 Bit mit Vorzeichen usw. ist?

In Python sind diese Details Implementierungsdetails. Im Allgemeinen kümmern wir uns in Python normalerweise nicht darum. Um jedoch Ihre Neugier zu sättigen ...

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

Zum Beispiel können wir in einem 32-Bit-Python 2 folgern, dass int eine 32-Bit-Ganzzahl mit Vorzeichen ist:

>>> import sys

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

In Python 3 geht der alte int weg und wir benutzen (Python's) nur long als int, was hat unbegrenzte Präzision.

Wir können auch Informationen über Pythons Floats erhalten, die normalerweise als doppelt in C:

>>> 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

Benutze es nicht __class__, eine semantisch nicht öffentliche API, um den Typ einer Variablen zu erhalten. Benutzen type stattdessen.

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


77
2018-03-18 02:48



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'>

36
2017-12-31 08:08



Die Frage ist etwas zweideutig - ich bin mir nicht sicher, was Sie mit "Ansicht" meinen. Wenn Sie es versuchen Abfrage der Typ eines nativen Python-Objekts, @atzzDie Antwort wird dich in die richtige Richtung lenken.

Wenn Sie es jedoch versuchen generieren Python-Objekte mit der Semantik primitiver C-Typen (wie z uint32_t, int16_t), benutze die struct Modul. Sie können so die Anzahl der Bits in einem gegebenen C-Typ-Primitiv 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 in der array Modul, das Arrays dieser untergeordneten Typen erstellen kann:

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

Die maximal unterstützte Ganzzahl (Python 2's int) ist gegeben durch sys.maxint.

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

Es gibt auch sys.getsizeof, die die tatsächliche Größe des zurückgegeben wird Python Objekt im Restspeicher:

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

Verwenden Sie für Floatdaten 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)

25
2017-12-31 08:02



print type(variable_name)

Ich empfehle auch die IPython Interaktiver Dolmetscher bei solchen Fragen. Es lässt Sie tippen variable_name? und gibt eine vollständige Liste von Informationen über das Objekt einschließlich des Typs und der Doc-Zeichenfolge für den Typ zurück.

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 einen String oder eine Zahl nach Möglichkeit in eine ganze Zahl. Ein Gleitkomma-Argument wird in Richtung Null abgeschnitten (dies schließt keine Zeichenfolge ein) Darstellung einer Fließkommazahl!) Verwenden Sie beim Konvertieren einer Zeichenkette die optionale Basis. Es ist ein Fehler, beim Konvertieren von a eine Base anzugeben         Nicht-Zeichenfolge. Wenn das Argument außerhalb des Ganzzahlbereichs liegt, ein langes Objekt         wird stattdessen zurückgegeben.


20
2017-08-14 06:39



Es kann wenig irrelevant sein. aber Sie können die Typen eines Objekts mit überprüfen isinstance(object, type) wie erwähnt Hier.


19
2017-12-31 08:10



Meinst du? Python oder verwenden Ctypes?

Im ersten Fall können Sie einfach nicht - weil Python keine 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'>

Für mehr Referenz auf Ctypes, ein seiner Art, siehe die offizielle Dokumentation.


18
2018-01-12 01:08