2010-08-09 20 views
5

Necesito hacer una cosa si args es un número entero y otra cosa si args es una cadena.¿Cómo verificar el tipo de variable? Python

¿Cómo puedo chack tipo? Ejemplo:

def handle(self, *args, **options): 

     if not args: 
      do_something() 
     elif args is integer: 
      do_some_ather_thing: 
     elif args is string: 
      do_totally_different_thing() 

Respuesta

13

Primero de, *args es siempre una lista. ¿Desea verificar si su contenido son cadenas?

import types 
def handle(self, *args, **options): 
    if not args: 
     do_something() 
    # check if everything in args is a Int 
    elif all(isinstance(s, types.IntType) for s in args): 
     do_some_ather_thing() 
    # as before with strings 
    elif all(isinstance(s, types.StringTypes) for s in args): 
     do_totally_different_thing() 

Utiliza types.StringTypes porque Python tiene en realidad dos tipos de cadenas: Unicode y cadenas de bytes - de esta manera tanto trabajo.

En Python3 los tipos incorporados se han eliminado de la lib types y solo hay un tipo de cadena. Esto significa que los controles de tipo se ven como isinstance(s, int) y isinstance(s, str).

+0

a la derecha. Es lista. – Pol

+0

¿Hay alguna preferencia para usar 'isinstance (s, types.IntType)' sobre '' isinstance (s, int) 'o solo para ser consistente con lo que mencionó para los dos tipos de cadenas? Sólo curioso. –

+1

¡Su solución no es compatible con Python 3.1! – banx

0
type(variable_name) 

Luego hay que utilizar:

if type(args) is type(0): 
    blabla 

encima estamos comparando si el tipo de los argumentos variables es el mismo que el literal 0 que es un entero, si desea saber si, por ejemplo, el tipo es largo, se compara con type(0l), etc.

+0

No entiendo. ¿Cómo usarlo? – Pol

+4

Ugh. 'type (2)' es 'int', pero de todos modos,' type' es Not Good Python – katrielalex

0

Si sabe que espera un argumento de entero/cadena, no debe tragarlo en *args. Qué

def handle(self, first_arg = None, *args, **kwargs): 
    if isinstance(first_arg, int): 
     thing_one() 
    elif isinstance(first_arg, str): 
     thing_two() 
1

También puede tratar de hacerlo de una manera más Pythonic sin utilizar type o isinstance (preferido porque es compatible con la herencia):

if not args: 
    do_something() 
else: 
    try: 
     do_some_other_thing() 
    except TypeError: 
     do_totally_different_thing() 

Obviamente, depende de lo que lo hace do_some_other_thing().

0

Nadie ha mencionado, pero la más fácil pedir perdón principio probablemente se aplica desde que supongo que va a hacer algo con ese entero:

def handle(self, *args, **kwargs): 
    try: 
     #Do some integer thing 
    except TypeError: 
     #Do some string thing 

Por supuesto, si esa cosa entera es la modificación de los valores en su lista, tal vez debería verificar primero. Por supuesto, si desea colocar a través de args y hacer algo para enteros y algo más para cuerdas:

def handle(self, *args, **kwargs): 
    for arg in args: 
     try: 
      #Do some integer thing 
     except TypeError: 
      #Do some string thing 

supuesto, esto también es suponiendo que ninguna otra operación en el intento arrojará un TypeError.

+0

en realidad lo he mencionado :) – systempuntoout

Cuestiones relacionadas