print number characters python string python-3.x python-2.x

number - python placeholder



Cómo comprobar si la variable es cadena con compatibilidad python 2 y 3 (8)

¿Qué tal esto, funciona en todos los casos?

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

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. ¿Es la isinstance(x, str) trabajo esperado 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"


El enfoque más escueto que he encontrado sin depender de paquetes como seis, es:

try: basestring except NameError: basestring = str

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

isinstance(s, basestring)

ahora también funcionará para Python 3+.


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 / except se realiza una vez, y luego define una función que siempre funciona y es lo más rápido posible.

EDITAR: 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 biblioteca future agrega (a Python 2) nombres compatibles , por lo que puede continuar escribiendo Python 3 . Usted puede hacer lo siguiente:

from builtins import str isinstance(x, str)

Para instalarlo , simplemente ejecuta pip install future .

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


Puede obtener la clase de un objeto llamando al object.__class__ , para verificar si object 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


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

from six import string_types isinstance(s, string_types)


Tal vez usar una solución como

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


tipo (cadena) == str

devuelve verdadero si es una cadena, y falso si no