Cómo verificar si la variable es una cadena con compatibilidad con Python 2 y 3

Soy consciente de que puedo usar: isinstance(x, str) en python-3.x pero necesito verificar si algo es una cadena en python-2.x también. ¿ isinstance(x, str) como se espera en python-2.x? ¿O tendré que verificar la versión y usar isinstance(x, basestr) ?

Específicamente, en python-2.x:

 >>>isinstance(u"test", str) False 

y python-3.x no tiene u"foo"

Si está escribiendo un código compatible con 2.x y 3.x, probablemente querrá usar seis :

 from six import string_types isinstance(s, string_types) 

El enfoque más conciso que he encontrado sin confiar en paquetes como seis, es:

 try: basestring except NameError: basestring = str 

luego, asumiendo que has estado buscando cadenas en Python 2 de la manera más genérica,

 isinstance(s, basestring) 

Ahora también funcionará para Python 3+.

¿Qué pasa con esto, funciona en todos los casos?

 isinstance(x, ("".__class__, u"".__class__)) 

Esta es la respuesta de @Lev Levitsky, reescrita un poco.

 try: isinstance("", basestring) def isstr(s): return isinstance(s, basestring) except NameError: def isstr(s): return isinstance(s, str) 

La try / prueba se realiza una vez, y luego define una función que siempre funciona y es lo más rápida posible.

EDIT: En realidad, ni siquiera necesitamos llamar a isinstance() ; solo tenemos que evaluar la basestring y ver si obtenemos un NameError :

 try: basestring # attempt to evaluate basestring def isstr(s): return isinstance(s, basestring) except NameError: def isstr(s): return isinstance(s, str) 

Creo que es más fácil seguir con la llamada a isinstance() , sin embargo.

La future biblioteca agrega (a Python 2) nombres compatibles , por lo que puede continuar escribiendo Python 3 . Usted puede simplemente hacer lo siguiente:

 from builtins import str isinstance(x, str) 

Para instalarlo , simplemente ejecute pip install future .

Como advertencia , solo es compatible con python>=2.6 , >=3.3 , pero es más moderno que six , que solo se recomienda si se usa python 2.5

Tal vez use una solución como

 def isstr(s): try: return isinstance(s, basestring) except NameError: return isinstance(s, str) 

Puede obtener la clase de un objeto llamando al object.__class__ , así que para verificar si el objeto es el tipo de cadena predeterminado:

  isinstance(object,"".__class__) 

Y puede colocar lo siguiente en la parte superior de Su código para que las cadenas entre comillas estén en Unicode en Python 2:

  from __future__ import unicode_literals 

Puedes probar esto al principio de tu código:

 from __future__ import print_function import sys if sys.version[0] == "2": py3 = False else: py3 = True if py3: basstring = str else: basstring = basestring 

y más tarde en el código:

 anystring = "test" # anystring = 1 if isinstance(anystring, basstring): print("This is a string") else: print("No string") 

tipo (cadena) == str

devuelve true si es una cadena, y false si no