2011-08-17 29 views
28

Estoy tratando de resolver un desajuste de tipo al agregar una cadena a otra cadena en una operación de concatenación.cómo saber si una variable es una tupla, una cadena o un número entero?

Básicamente, el error devuelto es un error de tipo (no se puede concatenar cadena y tupla); así que me gustaría averiguar dónde asigné un valor como tupla en lugar de cadena.

Todos los valores que asigno son cadenas, así que tengo que averiguar de dónde viene la tupla, así que esperaba que haya una manera en python de descubrir qué contiene una variable y de qué tipo es .

Hasta el momento, usando pdb, pude verificar el contenido de las variables y obtuve correctamente los valores que esperaba; pero me gustaría saber también el tipo de la variable (por lógica, si el compilador puede generar un error de tipo, significa que sabe qué hay dentro de una variable y si es compatible con la operación a realizar; debe ser una forma de sacar ese valor/bandera).

¿Hay alguna manera de imprimir el tipo de una variable en python?

Por cierto, traté de cambiar todas mis variables para que sean cadenas explícitamente, pero no es posible forzar str (myvar), por lo que no puedo simplemente usar como tipo de cadena en todas las cadenas de caracteres que uso.

+1

No queriendo ser delicado, pero las variables nunca tienen un tipo en Python, solo los objetos (referenciados por variables) lo hacen. Debido a esto, no hay moldes de tipos reales, solo funciones de conversión de objetos. –

+0

Indeed Jurgen; No estoy completamente al tanto de cómo funciona Python bajo el capó, pero supongo que es un lenguaje orientado a objetos, así que cuando creo una variable creará un objeto del tipo de datos correcto y lo referenciará con un puntero, así que cuando use el variable, de hecho, estoy usando una instancia de la cadena del objeto (o cualquier otro tipo de datos).El punto final es obtener el tipo de ese objeto :) –

Respuesta

23

que acaba de utilizar:

type(varname) 

que será int salida, str, flotador, etc ...

+0

Usar '__class__' casi siempre es mejor que usar' type' porque en la mayoría de las situaciones, devolverán lo mismo, excepto que 'type' declarará el tipo de todas las clases antiguas para ser 'instancia'. consulte [esta pregunta SO] (http://stackoverflow.com/questions/1060499/difference-between-typeobj-and-obj-class) –

+0

Gracias Gabriel; ¿se usa esto en tiempo de ejecución mientras está en pdb? porque obtengo un error de sintaxis cuando intento hacer un tipo (myvarname) –

+0

Acabo de agregar un tipo de impresión (myvar) y obtengo el tipo en pdb :) –

13

hacer uso de isinstance?

if isinstance(var, int): 

if isinstance(var, str): 

if isinstance(var, tuple): 
+0

Las pruebas para 'str' fallarán en las cadenas' unicode'. Además, 'isinstance (var, tuple)' perderá cualquier variable que suceda como 'list's, que a menudo surgirá en situaciones como estas. Por supuesto, es posible que desee un error si la var es una instancia de una 'lista', pero es bueno asegurarse de saber qué va a pasar en diferentes situaciones. –

+0

En Python 3 puede usar una secuencia de tipos para probar: 'isinstance (var, (tuple, list))' – bugmenot123

4

Es posible que desee probar (suponiendo Python 2.x) usando isinstance(obj, basestring). Tiene las opciones de usar isinstance, type y llamar al atributo __class__, pero es probable que isinstance sea el que desee aquí. Eche un vistazo a this article para un tratamiento más completo de las diferencias entre las tres opciones.

+0

Gracias Darren; Probablemente haga las pruebas con su sugerencia, pero en este momento estoy usando pdb; entonces puedo averiguar cuál es la var problemática y evitar cometer el mismo error (me gusta la codificación defensiva pero al mismo tiempo prefiero evitar cometer un error en primera instancia, en lugar de confiar en un control para atrapar un posible Error). Interesante que también existe el atributo __class__; nunca lo oí. –

74
isinstance(obj, tuple) 
isinstance(obj, basestring) 
isinstance(obj, int) 
+0

gracias por la respuesta; esto es genial para un control mientras se ejecuta el programa, pero estoy tratando de obtener el valor mientras se depura con pdb. ¡Esta es una gran manera de evitar el problema! –

1

repr (objeto) dará una descripción textual del objeto, que debe mostrar el tipo y el valor. Tu puedes imprimir o ver esto en el depurador.

Para valores simples, repr generalmente devuelve la misma cadena que escribiría literalmente el valor en el código. Para las clases personalizadas que le da el nombre de clase y el identificador de objeto, o algo más si los class'es

__repr__ 

se redefine.

+0

Gracias por la respuesta Jurgen. Intenté repr pero me devuelve el valor de la variable * en mi caso, la cadena), por lo que hace lo mismo que p (nombre var) ... estoy haciendo algo mal, ya que debería ver lo que mencionaste, escribir, valor y descripción del objeto? –

+1

No. Devuelve una cadena literal para un str o unicode *, incluidas * las comillas, por lo que debe reconocerlo como ese tipo. Devuelve dígitos sin comillas para tipos enteros y similares para otros tipos numéricos. Para una clase A personalizada, devuelve algo como de forma predeterminada, pero algunas clases sobrescriben esta cadena de descripción. –

+0

Veo; de hecho, es realmente útil, ¡muchas gracias! –

1

Tenga en cuenta que, si desea comprobar su tipo var en la declaración if, la construcción if type(varname) == "tuple": no funcionará. Pero estos serán:

if type(varname) is tuple: 
if type(varname) is list: 
if type(varname) is dict: 
if type(varname) is int: 
if type(varname) is str: 
+0

En realidad, debería usar isinstance. type() es peligroso cuando se trata de herencia. – bugmenot123

Cuestiones relacionadas