¿Cuál es la forma pythonica de diferenciar entre una cadena y una lista?

Para mi progtwig tengo muchos lugares donde un objeto puede ser una cadena o una lista que contiene cadenas y otras listas similares. Estos generalmente se leen desde un archivo JSON. Ambos necesitan ser tratados de manera diferente. En este momento, solo estoy usando isinstancia, pero esa no es la forma más pythonica de hacerlo, así que, ¿alguien tiene una forma mejor de hacerlo?

No es necesario importar módulos, isinstance() , str y unicode (versiones anteriores a 3 – ¡no hay unicode en 3!) Hará el trabajo por usted.

Python 2.x:

 Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> isinstance(u'', (str, unicode)) True >>> isinstance('', (str, unicode)) True >>> isinstance([], (str, unicode)) False >>> for value in ('snowman', u'☃ ', ['snowman', u'☃ ']): ... print type(value) ...    

Python 3.x:

 Python 3.2 (r32:88445, May 29 2011, 08:00:24) [GCC 4.2.1 (Apple Inc. build 5664)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> isinstance('☃ ', str) True >>> isinstance([], str) False >>> for value in ('snowman', '☃ ', ['snowman', '☃ ']): ... print(type(value)) ...    

Desde PEP008 :

Las comparaciones de tipos de objetos siempre deben usar isinstance() lugar de comparar tipos directamente.

Ya que Python3 ya no tiene unicode o basestring , en este caso (donde se espera una lista o una cadena) es mejor probar contra la list

 if isinstance(thing, list): # treat as list else: # treat as str/unicode 

ya que es compatible con Python2 y Python3

Utilizando isinstance :

En Python> = 2.3 una cadena puede ser de tipo str o unicode . Para comprobar ambos casos:

 if isinstance(a,basestring): # same as isinstance(obj, (str, unicode)) print "Object is a string" 

Desde Python 3 solo existe un tipo de cadena, así que en lugar de basestring , deberías usar str :

 if isinstance(a,str): print "Object is a string" 

Otro método, utilizando la práctica de “es mejor pedir perdón que permiso”, en general se prefiere la tipificación de pato en Python, podría intentar hacer lo que quiera primero, por ejemplo:

 try: value = v.split(',')[0] except AttributeError: # 'list' objects have no split() method value = v[0] 

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

 # trick for py2/3 compatibility if 'basestring' not in globals(): basestring = str v = "xx" if isinstance(v, basestring): print("is string") 

Puede utilizar el módulo de tipos:

 import types if type(ls) == types.ListType: #your code for list objects here