2009-05-28 11 views
32

Tengo un método que me permite aceptar una sola cadena (una ruta, pero no necesariamente una que exista en la máquina que ejecuta el código) o una lista/tupla de cadenas.Compruebe si la entrada es una lista/tupla de cadenas o una sola cadena

Dado que las cadenas actúan como listas de caracteres, ¿cómo puedo saber qué tipo ha recibido el método?

Me gustaría poder aceptar cadenas estándar o unicode para una sola entrada, y listas o tuplas para múltiples, por lo que la instancia no parece ser la respuesta a menos que me esté perdiendo un truco inteligente con (¿como aprovechar las clases ancestrales comunes?).

versión

Python es 2,5

+2

muestra de entrada/salida hace que este tipo de preguntas mucho más fácil de interpretar –

+0

Aquí la respuesta simple http://stackoverflow.com/a/26797718/99834 - no es obvio debido a los cambios py2-3. – sorin

Respuesta

44

Puede comprobar si una variable es una cadena de cuerda o Unicode con

isinstance(some_object, basestring) 

Esto devolverá True para ambas cadenas y cadenas Unicode

Editar:

Usted podría hacer algo como esto :

if isinstance(some_object, basestring): 
    ... 
elif all(isinstance(item, basestring) for item in some_object): # check iterable for stringness of all items. Will raise TypeError if some_object is not iterable 
    ... 
else: 
    raise TypeError # or something along that line 

Stringness is Probablemente no es una palabra, pero espero que la idea

+0

¡Ajá! Pensé que debe haber algún ancestro común en alguna parte, simplemente no pude encontrar la referencia ... – mavnn

1

¿Ha considerado varargs sintaxis? No estoy muy seguro de si esto es lo que estás preguntando, pero ¿algo como this question estaría en tus líneas?

+0

¿No sería eso solo obligar a la persona que llama a especificar cuál fue enviado? Prefiero evitar eso si es posible. (Y también estoy intrigado sobre si lo que quiero hacer es posible de una manera elegante ...) – mavnn

3

Comprobar el tipo con isinstance (arg, basestring)

11

La verificación de tipos:

def func(arg): 
    if not isinstance(arg, (list, tuple)): 
     arg = [arg] 
    # process 

func('abc') 
func(['abc', '123']) 

Varargs:

def func(*arg): 
    # process 

func('abc') 
func('abc', '123') 
func(*['abc', '123']) 
5

isinstance es una opción:

In [2]: isinstance("a", str) 
Out[2]: True 

In [3]: isinstance([], str) 
Out[3]: False 

In [4]: isinstance([], list) 
Out[4]: True 

In [5]: isinstance("", list) 
Out[5]: False 
5

Como me gusta mantener las cosas simples, aquí es la forma más corta que es compatible tanto con 2.xy 3.x:

# trick for py2/3 compatibility 
if 'basestring' not in globals(): 
    basestring = str 

v = "xx" 

if isinstance(v, basestring): 
    print("is string") 
-1

¿No puedes hacer:

(i == list (i) or i == tuple (i)) 

sería responder si la entrada es tupla o lista. El único problema es que no funciona correctamente con una tupla que contiene solo una variable.

3
>>> type('abc') is str 
True 
>>> type(['abc']) is str 
False 

Este código es compatible con Python 2 y 3

Cuestiones relacionadas