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)TrueEsperaba que isinstance (u "foo", string_types) devuelva false.stryunicodeen Python 2, ostren Python 3. Si no deseaunicodecontar con Python 2, simplemente usestr.futurepaquete en lugar desix:from future.utils import string_typesEl 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.pyif not hasattr(__builtins__, "basestring"): basestring = (str, bytes)¿Qué pasa con esto, funciona en todos los casos?
fuente
from __future__ import unicode_literalsactivo. Ahora voy con:isinstance(val, (str, u"".__class__))Esta es la respuesta de @Lev Levitsky, reescrita un poco.
La prueba
try/exceptse 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 evaluarbasestringy 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 = strLa
futurebiblioteca 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.3pero es más moderno quesix, lo que solo se recomienda si se usapython 2.5fuente
Tal vez use una solución como
fuente
isinstance(u'hello', basestr)rindeSyntaxError: invalid syntaxcon 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 constrybasestrstren Python3 es, por definición, Unicode. En consecuencia, no hay ningúnbasestringtipo, por lo tanto, esoNameErrorestá atrapado en mi fragmento.try/exceptuna 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.textes 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,
strybytesson 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
stringhay una cadena Unicode