J'ai dû doubler la prise quand j'ai vu ça. Java SE8 contient maintenant des entiers non signés, et j'ai tellement développé avec lui qu'il semble péché que Java n'ait jamais eu d'entiers non signés avant SE8.
Il existe de bonnes et de mauvaises façons de faire à peu près tout en Python. Voici la bonne façon:
Utilisation type
>>> type(one)<type 'int'>
Vous pouvez utiliser l' __name__attribut pour obtenir le nom de l'objet. (C'est l'un des rares attributs spéciaux dont vous avez besoin pour utiliser le __dunder__nom - il n'y a même pas de méthode pour cela dans le inspectmodule.)
>>> type(one).__name__
'int'
Ne pas utiliser __class__
En Python, les noms commençant par des traits de soulignement ne font pas sémantiquement partie de l'API publique, et il est recommandé aux utilisateurs d'éviter de les utiliser. (Sauf lorsque cela est absolument nécessaire.)
Puisque typenous donne la classe de l'objet, nous devons éviter de l'obtenir directement. :
>>> one.__class__
C'est généralement la première idée que les gens ont lorsqu'ils accèdent au type d'un objet dans une méthode - ils recherchent déjà des attributs, donc le type semble bizarre. Par exemple:
classFoo(object):def foo(self):
self.__class__
Non. Au lieu de cela, tapez (self):
classFoo(object):def foo(self):
type(self)
Détails d'implémentation des entiers et flotteurs
Comment puis-je voir le type d'une variable, qu'elle soit non signée 32 bits, signée 16 bits, etc.?
En Python, ces spécificités sont des détails d'implémentation. Donc, en général, nous ne nous inquiétons généralement pas de cela en Python. Cependant, pour rassasier votre curiosité ...
En Python 2, int est généralement un entier signé égal à la largeur de mot de l'implémentation (limité par le système). Il est généralement mis en œuvre en tant que longue en C . Lorsque les entiers deviennent plus grands que cela, nous les convertissons généralement en longs Python (avec une précision illimitée, à ne pas confondre avec les longs C).
Par exemple, dans un Python 2 32 bits, nous pouvons déduire que int est un entier signé 32 bits:
>>>import sys
>>> format(sys.maxint,'032b')'01111111111111111111111111111111'>>> format(-sys.maxint -1,'032b')# minimum value, see docs.'-10000000000000000000000000000000'
En Python 3, l'ancien int disparaît, et nous utilisons juste (Python) tant que int, qui a une précision illimitée.
Nous pouvons également obtenir des informations sur les flotteurs de Python, qui sont généralement implémentés en double en C:
N'utilisez pas __class__, une API sémantiquement non publique, pour obtenir le type d'une variable. Utilisez typeplutôt.
Et ne vous inquiétez pas trop des détails d'implémentation de Python. Je n'ai pas eu à régler moi-même les problèmes à ce sujet. Vous ne le ferez probablement pas non plus, et si vous le faites vraiment, vous devriez en savoir assez pour ne pas chercher cette réponse pour savoir quoi faire.
le type sort comme <type instance>mais __class__donne email.message.Message- qu'est-ce que je fais mal?
Jasen
@Jasen Utilisez-vous Python 2 et n'en héritez-vous pas object?
Aaron Hall
oui, en utilisant simplement import email aucune classe de ma propre invention.
Jasen
65
print type(variable_name)
Je recommande également fortement l' interpréteur interactif IPython lorsque vous traitez des questions comme celle-ci. Il vous permet de taper variable_name?et retournera toute une liste d'informations sur l'objet, y compris le type et la chaîne de doc pour le type.
par exemple
In[9]: var =123In[10]: var?Type: int
BaseClass:<type 'int'>StringForm:123Namespace:InteractiveDocstring:
int(x[, base])-> integer
Convertissez une chaîne ou un nombre en entier, si possible. Un argument à virgule flottante sera tronqué vers zéro (cela n'inclut pas une représentation sous forme de chaîne d'un nombre à virgule flottante!) Lors de la conversion d'une chaîne, utilisez la base facultative. C'est une erreur de fournir une base lors de la conversion d'une non-chaîne. Si l'argument est en dehors de la plage entière, un objet long sera renvoyé à la place.
re: comment "les noms qui commencent par des traits de soulignement ..." (les soulignements simples) sont très différents des doubles soulignements ("dunders") et ils font définitivement partie de l'API publique et c'est certainement bien de les utiliser. Cela peut être utile ... youtu.be/wf-BqAjZb8M
michael
31
Exemples de vérification de type simple en Python:
assert type(variable_name)== int
assert type(variable_name)== bool
assert type(variable_name)== list
Je pense que celle-ci est bien meilleure que la fonction de type à utiliser dans le processus de vérification. Si vous voulez vérifier et agir avec le résultat que vous devez utiliser, essayez catch avec le type mais isinstance renvoie true ou false
alkanschtein
24
La question est quelque peu ambiguë - je ne suis pas sûr de ce que vous entendez par «vue». Si vous essayez d' interroger le type d'un objet Python natif, la réponse de @atzz vous orientera dans la bonne direction.
Cependant, si vous essayez de générer des objets Python qui ont la sémantique des types C primitifs, (tels que uint32_t, int16_t), utilisez le structmodule. Vous pouvez ainsi déterminer le nombre de bits dans une primitive de type C donnée:
Si je comprends bien, la question porte sur l'interrogation du type d'une "variable" en Python. Votre réponse est généralement correcte mais hors sujet.
tzot
19
Vous voulez dire en Python ou en utilisant des ctypes ?
Dans le premier cas, vous ne pouvez tout simplement pas - car Python n'a pas d'entiers 16/32 bits signés / non signés.
Dans le second cas, vous pouvez utiliser type():
>>>import ctypes
>>> a = ctypes.c_uint()# unsigned int>>> type(a)<class'ctypes.c_ulong'>
Python n'a pas les types que vous décrivez. Il existe deux types utilisés pour représenter les valeurs intégrales:, intce qui correspond au type int de la plate-forme en C, et long, qui est un entier de précision arbitraire (c'est-à-dire qu'il croît au besoin et n'a pas de limite supérieure). intles s sont convertis en silence longsi une expression produit un résultat qui ne peut pas être stocké dans int.
Cela dépend vraiment de quel niveau vous voulez dire. Dans Python 2.x, il existe deux types entiers, int(contraint à sys.maxint) et long(précision illimitée), pour des raisons historiques. Dans le code Python, cela ne devrait pas faire une petite différence car l'interpréteur se convertit automatiquement en long lorsqu'un nombre est trop grand. Si vous souhaitez connaître les types de données réels utilisés dans l'interpréteur sous-jacent, cela dépend de l'implémentation. (Les CPython se trouvent dans Objects / intobject.c et Objects / longobject.c.) Pour en savoir plus sur les types de systèmes, consultez cdleary answer pour l'utilisation du module struct.
Juste, ne le fait pas. Demander le type de quelque chose est mauvais en soi. Utilisez plutôt le polymorphisme. Trouvez ou si nécessaire définissez par vous-même la méthode qui fait ce que vous voulez pour tout type d'entrée possible et appelez-la simplement sans rien demander. Si vous devez travailler avec des types intégrés ou des types définis par une bibliothèque tierce, vous pouvez toujours en hériter et utiliser vos propres dérivés à la place. Ou vous pouvez les envelopper dans votre propre classe. Il s'agit de la méthode orientée objet pour résoudre ces problèmes.
Si vous insistez pour vérifier le type exact et placer des ifs sales ici et là, vous pouvez utiliser une __class__propriété ou une typefonction pour le faire, mais bientôt vous vous retrouverez à mettre à jour tous ces ifs avec des cas supplémentaires tous les deux ou trois commits. Le faire de la manière OO empêche cela et vous permet de définir uniquement une nouvelle classe pour un nouveau type d'entrée à la place.
Réponses:
Utilisez la
type()
fonction intégrée:Pour vérifier si une variable est d'un type donné, utilisez
isinstance
:Notez que Python n'a pas les mêmes types que C / C ++, ce qui semble être votre question.
la source
Vous recherchez peut-être la fonction intégrée .
type()
Voir les exemples ci-dessous, mais il n'y a pas de type "non signé" en Python comme Java.
Entier positif:
Grand entier positif:
Entier négatif:
Séquence littérale de caractères:
Entier à virgule flottante:
la source
C'est tellement simple. Vous le faites comme ça.
la source
Donc, si vous avez une variable, par exemple:
Vous voulez connaître son type?
Il existe de bonnes et de mauvaises façons de faire à peu près tout en Python. Voici la bonne façon:
Utilisation
type
Vous pouvez utiliser l'
__name__
attribut pour obtenir le nom de l'objet. (C'est l'un des rares attributs spéciaux dont vous avez besoin pour utiliser le__dunder__
nom - il n'y a même pas de méthode pour cela dans leinspect
module.)Ne pas utiliser
__class__
En Python, les noms commençant par des traits de soulignement ne font pas sémantiquement partie de l'API publique, et il est recommandé aux utilisateurs d'éviter de les utiliser. (Sauf lorsque cela est absolument nécessaire.)
Puisque
type
nous donne la classe de l'objet, nous devons éviter de l'obtenir directement. :C'est généralement la première idée que les gens ont lorsqu'ils accèdent au type d'un objet dans une méthode - ils recherchent déjà des attributs, donc le type semble bizarre. Par exemple:
Non. Au lieu de cela, tapez (self):
Détails d'implémentation des entiers et flotteurs
En Python, ces spécificités sont des détails d'implémentation. Donc, en général, nous ne nous inquiétons généralement pas de cela en Python. Cependant, pour rassasier votre curiosité ...
En Python 2, int est généralement un entier signé égal à la largeur de mot de l'implémentation (limité par le système). Il est généralement mis en œuvre en tant que longue en C . Lorsque les entiers deviennent plus grands que cela, nous les convertissons généralement en longs Python (avec une précision illimitée, à ne pas confondre avec les longs C).
Par exemple, dans un Python 2 32 bits, nous pouvons déduire que int est un entier signé 32 bits:
En Python 3, l'ancien int disparaît, et nous utilisons juste (Python) tant que int, qui a une précision illimitée.
Nous pouvons également obtenir des informations sur les flotteurs de Python, qui sont généralement implémentés en double en C:
Conclusion
N'utilisez pas
__class__
, une API sémantiquement non publique, pour obtenir le type d'une variable. Utiliseztype
plutôt.Et ne vous inquiétez pas trop des détails d'implémentation de Python. Je n'ai pas eu à régler moi-même les problèmes à ce sujet. Vous ne le ferez probablement pas non plus, et si vous le faites vraiment, vous devriez en savoir assez pour ne pas chercher cette réponse pour savoir quoi faire.
la source
<type instance>
mais__class__
donneemail.message.Message
- qu'est-ce que je fais mal?object
?import email
aucune classe de ma propre invention.Je recommande également fortement l' interpréteur interactif IPython lorsque vous traitez des questions comme celle-ci. Il vous permet de taper
variable_name?
et retournera toute une liste d'informations sur l'objet, y compris le type et la chaîne de doc pour le type.par exemple
Convertissez une chaîne ou un nombre en entier, si possible. Un argument à virgule flottante sera tronqué vers zéro (cela n'inclut pas une représentation sous forme de chaîne d'un nombre à virgule flottante!) Lors de la conversion d'une chaîne, utilisez la base facultative. C'est une erreur de fournir une base lors de la conversion d'une non-chaîne. Si l'argument est en dehors de la plage entière, un objet long sera renvoyé à la place.
la source
print type(str)
renvoie une erreur dans Python 3.6. Utilisationtype(str)
print(type(str))
print type(var)
code erroné.la source
Encore une façon d'utiliser
__class__
:la source
Exemples de vérification de type simple en Python:
la source
Cela peut être peu pertinent. mais vous pouvez vérifier les types d'un objet avec
isinstance(object, type)
comme mentionné ici .la source
La question est quelque peu ambiguë - je ne suis pas sûr de ce que vous entendez par «vue». Si vous essayez d' interroger le type d'un objet Python natif, la réponse de @atzz vous orientera dans la bonne direction.
Cependant, si vous essayez de générer des objets Python qui ont la sémantique des types C primitifs, (tels que
uint32_t
,int16_t
), utilisez lestruct
module. Vous pouvez ainsi déterminer le nombre de bits dans une primitive de type C donnée:Cela se reflète également dans le
array
module, qui peut créer des tableaux de ces types de niveau inférieur:Entier maximal pris en charge (Python 2
int
) est donné par sys.maxint .Il existe également sys.getsizeof , qui retourne la taille réelle de l' objet Python dans la mémoire résiduelle:
Pour les données flottantes et les données de précision, utilisez sys.float_info :
la source
Vous voulez dire en Python ou en utilisant des ctypes ?
Dans le premier cas, vous ne pouvez tout simplement pas - car Python n'a pas d'entiers 16/32 bits signés / non signés.
Dans le second cas, vous pouvez utiliser
type()
:Pour plus de référence sur les ctypes, et son type, consultez la documentation officielle .
la source
Python n'a pas les types que vous décrivez. Il existe deux types utilisés pour représenter les valeurs intégrales:,
int
ce qui correspond au type int de la plate-forme en C, etlong
, qui est un entier de précision arbitraire (c'est-à-dire qu'il croît au besoin et n'a pas de limite supérieure).int
les s sont convertis en silencelong
si une expression produit un résultat qui ne peut pas être stocké dansint
.la source
Simple, pour python 3.4 et supérieur
Python 2.7 et supérieur
la source
Cela dépend vraiment de quel niveau vous voulez dire. Dans Python 2.x, il existe deux types entiers,
int
(contraint àsys.maxint
) etlong
(précision illimitée), pour des raisons historiques. Dans le code Python, cela ne devrait pas faire une petite différence car l'interpréteur se convertit automatiquement en long lorsqu'un nombre est trop grand. Si vous souhaitez connaître les types de données réels utilisés dans l'interpréteur sous-jacent, cela dépend de l'implémentation. (Les CPython se trouvent dans Objects / intobject.c et Objects / longobject.c.) Pour en savoir plus sur les types de systèmes, consultez cdleary answer pour l'utilisation du module struct.la source
Pour python2.x, utilisez
Pour python3.x, utilisez
la source
Juste, ne le fait pas. Demander le type de quelque chose est mauvais en soi. Utilisez plutôt le polymorphisme. Trouvez ou si nécessaire définissez par vous-même la méthode qui fait ce que vous voulez pour tout type d'entrée possible et appelez-la simplement sans rien demander. Si vous devez travailler avec des types intégrés ou des types définis par une bibliothèque tierce, vous pouvez toujours en hériter et utiliser vos propres dérivés à la place. Ou vous pouvez les envelopper dans votre propre classe. Il s'agit de la méthode orientée objet pour résoudre ces problèmes.
Si vous insistez pour vérifier le type exact et placer des
if
s sales ici et là, vous pouvez utiliser une__class__
propriété ou unetype
fonction pour le faire, mais bientôt vous vous retrouverez à mettre à jour tous cesif
s avec des cas supplémentaires tous les deux ou trois commits. Le faire de la manière OO empêche cela et vous permet de définir uniquement une nouvelle classe pour un nouveau type d'entrée à la place.la source