Wie sehe ich den Typ einer Variablen, ob sie vorzeichenlos 32 Bit, vorzeichenlos 16 Bit usw. ist?
Wie sehe ich es?
Wie sehe ich den Typ einer Variablen, ob sie vorzeichenlos 32 Bit, vorzeichenlos 16 Bit usw. ist?
Wie sehe ich es?
Antworten:
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.
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'>
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:
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 inspect
Modul gibt es nicht einmal eine Methode dafür .)
>>> type(one).__name__
'int'
__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 type
wir 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)
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)
Verwenden Sie keine __class__
semantisch nicht öffentliche API, um den Typ einer Variablen abzurufen. Verwenden Sie type
stattdessen.
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.
<type instance>
aber - was mache ich falsch? __class__
email.message.Message
object
?
import email
ich benutze nur keine Klassen meiner eigenen Erfindung.
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.
print type(str)
gibt einen Fehler in Python 3.6 zurück. Verwenden Sietype(str)
print(type(str))
print type(var)
fehlerhaften Code wirklich ändern .
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'>
Es kann wenig irrelevant sein. Sie können jedoch die Objekttypen isinstance(object, type)
wie hier beschrieben überprüfen .
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 struct
Modul. 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 array
Modul 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)
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 .
Python hat keine solchen Typen, wie Sie sie beschreiben. Es gibt zwei Typen, die zur Darstellung von Integralwerten verwendet werden: int
Dies entspricht dem Int-Typ der Plattform in C und long
ist eine Ganzzahl mit beliebiger Genauigkeit (dh sie wächst nach Bedarf und hat keine Obergrenze). int
s werden stillschweigend konvertiert, long
wenn ein Ausdruck ein Ergebnis erzeugt, in dem nicht gespeichert werden kann int
.
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.
Verwenden Sie für python2.x
print type(variable_name)
Verwenden Sie für python3.x
print(type(variable_name))
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 if
hier und da einige schmutzige s zu platzieren, können Sie die __class__
Eigenschaft oder type
Funktion verwenden, um dies zu tun. In Kürze werden Sie jedoch alle diese if
s 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.