Tuve que tomar dos veces cuando vi esto. Java SE8 ahora contiene enteros sin signo, y he desarrollado tanto con él que parece pecaminoso que Java nunca haya tenido enteros sin signo antes de SE8.
Hay formas correctas y formas incorrectas de hacer casi todo en Python. Aquí está la manera correcta:
Utilizar type
>>> type(one)<type 'int'>
Puede usar el __name__atributo para obtener el nombre del objeto. (Este es uno de los pocos atributos especiales que necesita para usar el __dunder__nombre para acceder; ni siquiera hay un método para ello en el inspectmódulo).
>>> type(one).__name__
'int'
No usar __class__
En Python, los nombres que comienzan con guiones bajos no son semánticamente parte de la API pública, y es una buena práctica para los usuarios evitar usarlos. (Excepto cuando sea absolutamente necesario).
Como typenos da la clase del objeto, debemos evitar obtener esto directamente. :
>>> one.__class__
Esta suele ser la primera idea que las personas tienen al acceder al tipo de un objeto en un método: ya están buscando atributos, por lo que el tipo parece extraño. Por ejemplo:
classFoo(object):def foo(self):
self.__class__
No lo hagas En cambio, escriba (self):
classFoo(object):def foo(self):
type(self)
Detalles de implementación de ints y flotantes
¿Cómo veo el tipo de variable si es de 32 bits sin signo, 16 bits con signo, etc.?
En Python, estos detalles son detalles de implementación. Entonces, en general, no nos preocupamos de esto en Python. Sin embargo, para saciar tu curiosidad ...
En Python 2, int suele ser un entero con signo igual al ancho de palabra de la implementación (limitado por el sistema). Por lo general, se implementa como largo en C . Cuando los enteros se hacen más grandes que esto, generalmente los convertimos en largos de Python (con precisión ilimitada, que no debe confundirse con largos de C).
Por ejemplo, en un Python 2 de 32 bits, podemos deducir que int es un entero de 32 bits con signo:
>>>import sys
>>> format(sys.maxint,'032b')'01111111111111111111111111111111'>>> format(-sys.maxint -1,'032b')# minimum value, see docs.'-10000000000000000000000000000000'
En Python 3, el int viejo desaparece, y solo usamos (Python) largo como int, que tiene una precisión ilimitada.
También podemos obtener información sobre las carrozas de Python, que generalmente se implementan como un doble en C:
No use __class__una API semánticamente no pública para obtener el tipo de una variable. Usar en su typelugar.
Y no se preocupe demasiado por los detalles de implementación de Python. No he tenido que lidiar con problemas relacionados con esto. Probablemente tampoco lo hará, y si realmente lo hace, debe saber lo suficiente como para no estar buscando esta respuesta para saber qué hacer.
el tipo sale como <type instance>pero __class__da email.message.Message- ¿qué estoy haciendo mal?
Jasen
@Jasen ¿Estás usando Python 2 y no heredas de object?
Aaron Hall
sí, simplemente import email no uso clases de mi propio invento.
Jasen
65
print type(variable_name)
También recomiendo encarecidamente el intérprete interactivo de IPython cuando se trata de preguntas como esta. Te permite escribirvariable_name? y devolverá una lista completa de información sobre el objeto, incluido el tipo y la cadena de documentación para el tipo.
p.ej
In[9]: var =123In[10]: var?Type: int
BaseClass:<type 'int'>StringForm:123Namespace:InteractiveDocstring:
int(x[, base])-> integer
Convierta una cadena o número a un entero, si es posible. Un argumento de coma flotante se truncará hacia cero (¡esto no incluye una representación de cadena de un número de coma flotante!) Al convertir una cadena, use la base opcional. Es un error proporcionar una base al convertir una no cadena. Si el argumento está fuera del rango entero, se devolverá un objeto largo.
re: comente "los nombres que comienzan con guiones bajos ..." (simples) los guiones bajos son muy diferentes a los guiones bajos ("dunders") y definitivamente son parte de la API pública y ciertamente está bien usarlos. Esto puede ser de ayuda ... youtu.be/wf-BqAjZb8M
michael
31
Ejemplos de comprobación de tipo simple en Python:
assert type(variable_name)== int
assert type(variable_name)== bool
assert type(variable_name)== list
Creo que esta es mucho mejor que la función de tipo para usar en el proceso de verificación. Si desea verificar y actuar con el resultado, debe usar try catch with type pero isinstance devuelve verdadero o falso
alkanschtein
24
La pregunta es algo ambigua: no estoy seguro de qué quieres decir con "vista". Si está intentando consultar el tipo de un objeto nativo de Python, @atzz la respuesta de en la dirección correcta.
Sin embargo, si estás intentando generar objetos de Python que tengan la semántica de los tipos C primitivos (como uint32_t, por ejemplo int16_t), use el structmódulo. De este modo, puede determinar el número de bits en una primitiva de tipo C dada:
Python no tiene los tipos que usted describe. Hay dos tipos utilizados para representar valores integrales: intque corresponde al tipo int de la plataforma en C y longque es un número entero de precisión arbitraria (es decir, crece según sea necesario y no tiene un límite superior). ints se convierten silenciosamente a longsi una expresión produce un resultado que no se puede almacenar int.
Realmente depende de a qué nivel te refieres. En Python 2.x, hay dos tipos enteros, int(restringidos a sys.maxint) y long(precisión ilimitada), por razones históricas. En el código Python, esto no debería hacer un poco de diferencia porque el intérprete se convierte automáticamente en largo cuando un número es demasiado grande. Si desea saber acerca de los tipos de datos reales utilizados en el intérprete subyacente, eso depende de la implementación. (Los CPython se encuentran en Objects / intobject.c y Objects / longobject.c.) Para obtener información sobre los tipos de sistemas, consulte la respuesta cdleary para usar el módulo struct.
Solo no lo hagas. Pedir el tipo de algo está mal en sí mismo. En su lugar, use el polimorfismo. Encuentre o, si es necesario, defina usted mismo el método que hace lo que desea para cualquier posible tipo de entrada y simplemente llámelo sin preguntar nada. Si necesita trabajar con tipos incorporados o tipos definidos por una biblioteca de terceros, siempre puede heredar de ellos y utilizar sus propios derivados. O puedes envolverlos dentro de tu propia clase. Esta es la forma orientada a objetos para resolver tales problemas.
Si insiste en verificar el tipo exacto y colocar algunos mensajes sucios ifaquí y allá, puede usar __class__propiedades o typefunciones para hacerlo, pero pronto se encontrará actualizando todos estos ifmensajes con casos adicionales cada dos o tres confirmaciones. Hacerlo de la manera OO evita eso y solo le permite definir una nueva clase para un nuevo tipo de entrada.
Respuestas:
Use la
type()
función integrada:Para verificar si una variable es de un tipo dado, use
isinstance
:Tenga en cuenta que Python no tiene los mismos tipos que C / C ++, que parece ser su pregunta.
fuente
Es posible que esté buscando la función incorporada .
type()
Vea los ejemplos a continuación, pero no hay ningún tipo "sin signo" en Python como Java.
Entero positivo:
Entero positivo grande :
Entero negativo:
Secuencia literal de caracteres:
Entero de coma flotante:
fuente
Es muy simple Lo haces así
fuente
Entonces, si tiene una variable, por ejemplo:
¿Quieres saber su tipo?
Hay formas correctas y formas incorrectas de hacer casi todo en Python. Aquí está la manera correcta:
Utilizar
type
Puede usar el
__name__
atributo para obtener el nombre del objeto. (Este es uno de los pocos atributos especiales que necesita para usar el__dunder__
nombre para acceder; ni siquiera hay un método para ello en elinspect
módulo).No usar
__class__
En Python, los nombres que comienzan con guiones bajos no son semánticamente parte de la API pública, y es una buena práctica para los usuarios evitar usarlos. (Excepto cuando sea absolutamente necesario).
Como
type
nos da la clase del objeto, debemos evitar obtener esto directamente. :Esta suele ser la primera idea que las personas tienen al acceder al tipo de un objeto en un método: ya están buscando atributos, por lo que el tipo parece extraño. Por ejemplo:
No lo hagas En cambio, escriba (self):
Detalles de implementación de ints y flotantes
En Python, estos detalles son detalles de implementación. Entonces, en general, no nos preocupamos de esto en Python. Sin embargo, para saciar tu curiosidad ...
En Python 2, int suele ser un entero con signo igual al ancho de palabra de la implementación (limitado por el sistema). Por lo general, se implementa como largo en C . Cuando los enteros se hacen más grandes que esto, generalmente los convertimos en largos de Python (con precisión ilimitada, que no debe confundirse con largos de C).
Por ejemplo, en un Python 2 de 32 bits, podemos deducir que int es un entero de 32 bits con signo:
En Python 3, el int viejo desaparece, y solo usamos (Python) largo como int, que tiene una precisión ilimitada.
También podemos obtener información sobre las carrozas de Python, que generalmente se implementan como un doble en C:
Conclusión
No use
__class__
una API semánticamente no pública para obtener el tipo de una variable. Usar en sutype
lugar.Y no se preocupe demasiado por los detalles de implementación de Python. No he tenido que lidiar con problemas relacionados con esto. Probablemente tampoco lo hará, y si realmente lo hace, debe saber lo suficiente como para no estar buscando esta respuesta para saber qué hacer.
fuente
<type instance>
pero__class__
daemail.message.Message
- ¿qué estoy haciendo mal?object
?import email
no uso clases de mi propio invento.También recomiendo encarecidamente el intérprete interactivo de IPython cuando se trata de preguntas como esta. Te permite escribir
variable_name?
y devolverá una lista completa de información sobre el objeto, incluido el tipo y la cadena de documentación para el tipo.p.ej
Convierta una cadena o número a un entero, si es posible. Un argumento de coma flotante se truncará hacia cero (¡esto no incluye una representación de cadena de un número de coma flotante!) Al convertir una cadena, use la base opcional. Es un error proporcionar una base al convertir una no cadena. Si el argumento está fuera del rango entero, se devolverá un objeto largo.
fuente
print type(str)
devuelve un error en Python 3.6. Usotype(str)
print(type(str))
print type(var)
código erróneo.fuente
Una forma más de usar
__class__
:fuente
Ejemplos de comprobación de tipo simple en Python:
fuente
Puede ser poco irrelevante. pero puede verificar los tipos de un objeto
isinstance(object, type)
como se menciona aquí .fuente
La pregunta es algo ambigua: no estoy seguro de qué quieres decir con "vista". Si está intentando consultar el tipo de un objeto nativo de Python, @atzz la respuesta de en la dirección correcta.
Sin embargo, si estás intentando generar objetos de Python que tengan la semántica de los tipos C primitivos (como
uint32_t
, por ejemploint16_t
), use elstruct
módulo. De este modo, puede determinar el número de bits en una primitiva de tipo C dada:Esto también se refleja en el
array
módulo, que puede hacer matrices de estos tipos de nivel inferior:El número entero máximo admitido (Python 2
int
) viene dado por sys.maxint .También hay sys.getsizeof , que devuelve el tamaño real del objeto Python en la memoria residual:
Para datos flotantes y datos de precisión, use sys.float_info :
fuente
¿Te refieres a Python o al uso de ctypes ?
En el primer caso, simplemente no puede, porque Python no tiene enteros de 16/32 bits con signo / sin signo.
En el segundo caso, puedes usar
type()
:Para obtener más referencias sobre ctypes, y su tipo, consulte la documentación oficial .
fuente
Python no tiene los tipos que usted describe. Hay dos tipos utilizados para representar valores integrales:
int
que corresponde al tipo int de la plataforma en C ylong
que es un número entero de precisión arbitraria (es decir, crece según sea necesario y no tiene un límite superior).int
s se convierten silenciosamente along
si una expresión produce un resultado que no se puede almacenarint
.fuente
Simple, para python 3.4 y superior
Python 2.7 y superior
fuente
Realmente depende de a qué nivel te refieres. En Python 2.x, hay dos tipos enteros,
int
(restringidos asys.maxint
) ylong
(precisión ilimitada), por razones históricas. En el código Python, esto no debería hacer un poco de diferencia porque el intérprete se convierte automáticamente en largo cuando un número es demasiado grande. Si desea saber acerca de los tipos de datos reales utilizados en el intérprete subyacente, eso depende de la implementación. (Los CPython se encuentran en Objects / intobject.c y Objects / longobject.c.) Para obtener información sobre los tipos de sistemas, consulte la respuesta cdleary para usar el módulo struct.fuente
Para python2.x, use
Para python3.x, use
fuente
Solo no lo hagas. Pedir el tipo de algo está mal en sí mismo. En su lugar, use el polimorfismo. Encuentre o, si es necesario, defina usted mismo el método que hace lo que desea para cualquier posible tipo de entrada y simplemente llámelo sin preguntar nada. Si necesita trabajar con tipos incorporados o tipos definidos por una biblioteca de terceros, siempre puede heredar de ellos y utilizar sus propios derivados. O puedes envolverlos dentro de tu propia clase. Esta es la forma orientada a objetos para resolver tales problemas.
Si insiste en verificar el tipo exacto y colocar algunos mensajes sucios
if
aquí y allá, puede usar__class__
propiedades otype
funciones para hacerlo, pero pronto se encontrará actualizando todos estosif
mensajes con casos adicionales cada dos o tres confirmaciones. Hacerlo de la manera OO evita eso y solo le permite definir una nueva clase para un nuevo tipo de entrada.fuente