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