Soy consciente de que puedo usar: isinstance(x, str)
en python-3.x, pero también necesito verificar si algo es una cadena en python-2.x. ¿ isinstance(x, str)
Funcionará como se esperaba en python-2.x? ¿O tendré que verificar la versión y usarla isinstance(x, basestr)
?
Específicamente, en python-2.x:
>>>isinstance(u"test", str)
False
y python-3.x no tiene u"foo"
python
string
python-3.x
python-2.x
Randall Hunt
fuente
fuente
Respuestas:
Si está escribiendo código compatible con 2.xy 3.x, probablemente quiera usar seis :
fuente
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Esperaba que isinstance (u "foo", string_types) devuelva false.str
yunicode
en Python 2, ostr
en Python 3. Si no deseaunicode
contar con Python 2, simplemente usestr
.future
paquete en lugar desix
:from future.utils import string_types
El enfoque más conciso que he encontrado sin depender de paquetes como seis, es:
luego, suponiendo que haya estado buscando cadenas en Python 2 de la manera más genérica,
ahora también funcionará para Python 3+.
fuente
basestring = (str, bytes)
derequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
¿Qué pasa con esto, funciona en todos los casos?
fuente
from __future__ import unicode_literals
activo. Ahora voy con:isinstance(val, (str, u"".__class__))
Esta es la respuesta de @Lev Levitsky, reescrita un poco.
La prueba
try
/except
se realiza una vez y luego define una función que siempre funciona y es lo más rápida posible.EDITAR: En realidad, ni siquiera necesitamos llamar
isinstance()
; solo necesitamos evaluarbasestring
y ver si obtenemos unNameError
:Sin embargo, creo que es más fácil seguir con la llamada
isinstance()
.fuente
isinstance("", basestring)
es lo que quise decir con "llamar". De todos modos, +1.try: string_types = basestring except NameError: string_types = str
La
future
biblioteca agrega (a Python 2) nombres compatibles , por lo que puede continuar escribiendo Python 3 . Simplemente puede hacer lo siguiente:Para instalarlo , solo ejecute
pip install future
.Como advertencia , solo es compatible
python>=2.6
,>=3.3
pero es más moderno quesix
, lo que solo se recomienda si se usapython 2.5
fuente
Tal vez use una solución como
fuente
isinstance(u'hello', basestr)
rindeSyntaxError: invalid syntax
con Python 3.2.3 en la Ventana 7 ... ¿alguna idea de por qué esto sería? Parece que no le gusta elu
- Me sale este error constr
ybasestr
str
en Python3 es, por definición, Unicode. En consecuencia, no hay ningúnbasestring
tipo, por lo tanto, esoNameError
está atrapado en mi fragmento.try
/except
una sola vez, y en función de los resultados de esa prueba única, usted defineisstr()
correctamente. No es necesario incurrir en la sobrecarga de una excepción por cada llamada aisstr()
.Puede obtener la clase de un objeto llamando
object.__class__
, por lo que para verificar si el objeto es el tipo de cadena predeterminado: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:
fuente
some_element.text
es un 'str' pero la comparación con 'unicode' fallaríaPuedes probar esto al comienzo de tu código:
y luego en el código:
fuente
¡Ten cuidado! En python 2,
str
ybytes
son esencialmente lo mismo. Esto puede causar un error si está tratando de distinguir entre los dos.fuente
tipo (cadena) == cadena
devuelve verdadero si es una cadena y falso si no
fuente
string
hay una cadena Unicode