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.
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:
classFoo(object):def foo(self):
self.__class__
Tu es nicht. Geben Sie stattdessen (self) ein:
classFoo(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 :
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 =123In[10]: var?Type: int
BaseClass:<type 'int'>StringForm:123Namespace:InteractiveDocstring:
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.
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
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:
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.
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.
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.
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.
Antworten:
Verwenden Sie die
type()
eingebaute Funktion:Verwenden Sie Folgendes, um zu überprüfen, ob eine Variable von einem bestimmten Typ ist
isinstance
:Beachten Sie, dass Python nicht die gleichen Typen wie C / C ++ hat, was Ihre Frage zu sein scheint.
quelle
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:
Große positive ganze Zahl:
Negative Ganzzahl:
Wörtliche Zeichenfolge:
Gleitkomma-Ganzzahl:
quelle
Es ist so einfach. Du machst es so.
quelle
Wenn Sie also eine Variable haben, zum Beispiel:
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
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. Iminspect
Modul gibt es nicht einmal eine Methode dafür .)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
type
wir die Klasse des Objekts erhalten, sollten wir vermeiden, dies direkt zu erhalten. ::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:
Tu es nicht. Geben Sie stattdessen (self) ein:
Implementierungsdetails von Ints und Floats
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:
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 :
Fazit
Verwenden Sie keine
__class__
semantisch nicht öffentliche API, um den Typ einer Variablen abzurufen. Verwenden Sietype
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.
quelle
<type instance>
aber - was mache ich falsch?__class__
email.message.Message
object
?import email
ich benutze nur keine Klassen meiner eigenen Erfindung.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
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.
quelle
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 .quelle
Ein weiterer Weg mit
__class__
:quelle
Beispiele für die einfache Typprüfung in Python:
quelle
Es kann wenig irrelevant sein. Sie können jedoch die Objekttypen
isinstance(object, type)
wie hier beschrieben überprüfen .quelle
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 dasstruct
Modul. Sie können die Anzahl der Bits in einem bestimmten Grundelement vom Typ C folgendermaßen bestimmen:Dies spiegelt sich auch im
array
Modul wider , das Arrays dieser untergeordneten Typen erstellen kann:Die maximal unterstützte Ganzzahl (Python 2
int
) wird von sys.maxint angegeben .Es gibt auch sys.getsizeof , das die tatsächliche Größe des Python- Objekts im Restspeicher zurückgibt :
Verwenden Sie für Float-Daten und Präzisionsdaten sys.float_info :
quelle
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()
:Weitere Informationen zu ctypes und seinem Typ finden Sie in der offiziellen Dokumentation .
quelle
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 undlong
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 kannint
.quelle
Einfach, für Python 3.4 und höher
Python 2.7 und höher
quelle
Es kommt wirklich darauf an, welches Level du meinst. In Python 2.x gibt es aus historischen Gründen zwei Ganzzahltypen
int
(beschränkt aufsys.maxint
) undlong
(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.quelle
Verwenden Sie für python2.x
Verwenden Sie für python3.x
quelle
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 odertype
Funktion verwenden, um dies zu tun. In Kürze werden Sie jedoch alle dieseif
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.quelle