@Yarin: No. Pero no importa, porque Python 3.x no está diseñado para ser compatible con Python 2.x en absoluto.
netcoder
2
Descubrí que isinstance (s, str) funciona con py27, probado en: Python 2.7.5 (predeterminado, 25 de agosto de 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] en Darwin.
kakyo
25
@kakyo: El problema es que perderá unicodeobjetos, que también deberían considerarse cadenas. Tanto el tipo strcomo el tipo unicodetienen la clase base común basestring, y esto es lo que desea verificar.
Sven Marnach
77
@Yarin si está transfiriendo algo de 2.xa 3.x, siempre puede asignar basestring = str.
Jack
99
@AdamErickson ¿Para compatibilidad con qué exactamente? No es compatible para la compatibilidad con Python 3, ya que no existe unicodeen Python 3. Mi recomendación para la compatibilidad entre Python 2 y 3 es usar la biblioteca "seis". (Específicamente isintance(s, six.string_types)en este caso)
Sven Marnach
222
Sé que este es un tema antiguo, pero al ser el primero que se muestra en Google y dado que no encuentro ninguna de las respuestas satisfactorias, lo dejaré aquí para referencia futura:
six es una biblioteca de compatibilidad de Python 2 y 3 que ya cubre este problema. Entonces puedes hacer algo como esto:
import six
if isinstance(value, six.string_types):pass# It's a string !!
Al inspeccionar el código, esto es lo que encuentra:
Por ejemplo, para un trazador de líneas: value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)donde >=asume que cualquier Python 4+ eventual mantiene la strclase raíz para las cadenas.
Me gusta la elegancia de "if type (x) in (str, unicode):", pero veo que PyLint lo marca como "unidiomático".
eukras
16
La comparación de tipos con ==está explícitamente desaconsejada por PEP8, y tiene varias desventajas además de ser considerada "unidiomática", por ejemplo, no detecta instancias de subclases de str, que también deben considerarse cadenas. Si realmente desea verificar exactamente el tipo stry excluir explícitamente las subclases, use type(x) is str.
Sven Marnach
17
tu puedes hacer:
var =1if type(var)== int:print('your variable is an integer')
o:
var2 ='this is variable #2'if type(var2)== str:print('your variable is a string')else:print('your variable IS NOT a string')
Buena atrapada. No sabía sobre la cadena base. Se menciona alrededor de 3 publicaciones y parece una mejor respuesta.
Wade Hatler
66
isinstance()También toma una tupla como segundo argumento. Entonces, incluso si basestringno existiera, podría usarlo isinstance(target, (str, unicode)).
Martijn Pieters
3
En python 3.5.1, unicodeno parece estar definido:NameError: name 'unicode' is not defined
Eric Hu
11
como basestringno está definido en Python3, este pequeño truco podría ayudar a que el código sea compatible:
try:# check whether python knows about 'basestring'
basestring
exceptNameError:# no, it doesn't (it's Python3); use 'str' instead
basestring=str
después de eso, puede ejecutar la siguiente prueba en Python2 y Python3
¡Muchas gracias! Hay docenas de respuestas diferentes en Internet, pero la única buena es esta. La primera línea hace que type('foo')sea unicodepor defecto en python 2, y la segunda hace que strsea instancia de unicode. Thoses hace que el código sea válido en Python 2 y 3. ¡Gracias nuevamente!
Narann
9
También quiero notar que si desea verificar si el tipo de una variable es un tipo específico, puede comparar el tipo de la variable con el tipo de un objeto conocido.
Esta es una forma terrible, terrible de escribir check en python. ¿Qué pasa si otra clase hereda de str? ¿Qué pasa con las cadenas Unicode, que ni siquiera heredan stren 2.x? Usar isinstance(s, basestring)en 2.x, o isinstance(s, str)en 3.x.
Jack
1
@ Jack, por favor lea la pregunta, y también note que no escribo que es la mejor manera, solo otra forma.
Daniil Grankin
99
Esta es una mala idea por 3 razones: isinstance()permite subclases (que también son cadenas, solo especializadas), la type('')llamada adicional es redundante cuando solo puede usar stry los tipos son singletons, por type(s) is strlo que será una prueba más eficiente.
Martijn Pieters
8
Muchas buenas sugerencias proporcionadas por otros aquí, pero no veo un buen resumen multiplataforma. Lo siguiente debería ser un buen complemento para cualquier programa de Python:
def isstring(s):# if we use Python 3if(sys.version_info[0]>=3):return isinstance(s, str)# we use Python 2return isinstance(s, basestring)
En esta función, usamos isinstance(object, classinfo)para ver si nuestra entrada es a stren Python 3 o a basestringen Python 2.
Esto probablemente se romperá en Python 4, considere >=al menos.
thakis
2
sea más limpio para verificar six.string_types o six.text_type
daonb
@daonb importando un módulo completo solo para hacer una prueba de una línea es el pensamiento que causa que los árboles de dependencia locos y la hinchazón grave arruinen lo que debería ser algo corto, pequeño y simple. Es su decisión, por supuesto, pero solo diga ...
duanev
@duanev si te preocupa la compatibilidad con Python 2/3, de todos modos es una mejor idea usar seis en el proyecto. Six también es un archivo único, por lo que los árboles de dependencia / hinchazón no son un problema aquí.
MoxieBall
7
Forma alternativa para Python 2, sin usar la cadena base:
isinstance(s,(str, unicode))
Pero aún así no funcionará en Python 3 ya unicodeque no está definido (en Python 3).
Para Python 2.7.12 tuve que eliminar las comillas: escriba (a) en [str, unicode]
Adam Erickson
4
Aquí está mi respuesta para admitir Python 2 y Python 3 junto con estos requisitos:
Escrito en código Py3 con un mínimo código de compatibilidad Py2.
Elimine el código de compatibilidad Py2 más tarde sin interrupción. Es decir, solo para eliminar, no modificar el código Py3.
Evite el uso de sixmódulos compatibles o similares, ya que tienden a ocultar lo que se intenta lograr.
A prueba de futuro para un potencial Py4.
import sys
PY2 = sys.version_info.major ==2# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else(str, bytes))# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)
Simplemente puede usar la función isinstance para asegurarse de que los datos de entrada tengan formato de cadena o unicode . Los siguientes ejemplos lo ayudarán a comprender fácilmente.
type(str())es una forma muy indirecta de decir str. Los tipos son singletons, por lo que type(x) is stres más eficiente. isinstance()debe usarse en su lugar, a menos que tenga muy buenas razones para ignorar las subclases de str.
¿En qué caso preferirías type(thing).__name__ == 'str'sobre type(thing) == stro isinstance(thing, str)? Tampoco unicodeexiste en las versiones modernas de Python.
isinstance(True, int) is True
.isinstance(x,str)
es correcto en Python 3 (str es un tipo básico).Respuestas:
En Python 2.x, harías
basestring
es la superclase abstracta destr
yunicode
. Se puede usar para probar si un objeto es una instancia destr
ounicode
.En Python 3.x, la prueba correcta es
La
bytes
clase no se considera un tipo de cadena en Python 3.fuente
unicode
objetos, que también deberían considerarse cadenas. Tanto el tipostr
como el tipounicode
tienen la clase base comúnbasestring
, y esto es lo que desea verificar.basestring = str
.unicode
en Python 3. Mi recomendación para la compatibilidad entre Python 2 y 3 es usar la biblioteca "seis". (Específicamenteisintance(s, six.string_types)
en este caso)Sé que este es un tema antiguo, pero al ser el primero que se muestra en Google y dado que no encuentro ninguna de las respuestas satisfactorias, lo dejaré aquí para referencia futura:
six es una biblioteca de compatibilidad de Python 2 y 3 que ya cubre este problema. Entonces puedes hacer algo como esto:
Al inspeccionar el código, esto es lo que encuentra:
fuente
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
donde>=
asume que cualquier Python 4+ eventual mantiene lastr
clase raíz para las cadenas.En Python 3.xo Python 2.7.6
fuente
==
está explícitamente desaconsejada por PEP8, y tiene varias desventajas además de ser considerada "unidiomática", por ejemplo, no detecta instancias de subclases destr
, que también deben considerarse cadenas. Si realmente desea verificar exactamente el tipostr
y excluir explícitamente las subclases, usetype(x) is str
.tu puedes hacer:
o:
¡espero que esto ayude!
fuente
El módulo de tipo también existe si está comprobando más que ints y cadenas. http://docs.python.org/library/types.html
fuente
types.StringTypes
,.Editar basado en una mejor respuesta a continuación. Baja unas 3 respuestas y descubre la frescura de la cadena base.
Respuesta anterior: tenga cuidado con las cadenas Unicode, que puede obtener desde varios lugares, incluidas todas las llamadas COM en Windows.
fuente
isinstance()
También toma una tupla como segundo argumento. Entonces, incluso sibasestring
no existiera, podría usarloisinstance(target, (str, unicode))
.unicode
no parece estar definido:NameError: name 'unicode' is not defined
como
basestring
no está definido en Python3, este pequeño truco podría ayudar a que el código sea compatible:después de eso, puede ejecutar la siguiente prueba en Python2 y Python3
fuente
basestring = (str, bytes)
Python 2/3 incluyendo unicode
http://python-future.org/overview.html
fuente
type('foo')
seaunicode
por defecto en python 2, y la segunda hace questr
sea instancia deunicode
. Thoses hace que el código sea válido en Python 2 y 3. ¡Gracias nuevamente!También quiero notar que si desea verificar si el tipo de una variable es un tipo específico, puede comparar el tipo de la variable con el tipo de un objeto conocido.
Para la cadena puedes usar esto
fuente
str
? ¿Qué pasa con las cadenas Unicode, que ni siquiera heredanstr
en 2.x? Usarisinstance(s, basestring)
en 2.x, oisinstance(s, str)
en 3.x.isinstance()
permite subclases (que también son cadenas, solo especializadas), latype('')
llamada adicional es redundante cuando solo puede usarstr
y los tipos son singletons, portype(s) is str
lo que será una prueba más eficiente.Muchas buenas sugerencias proporcionadas por otros aquí, pero no veo un buen resumen multiplataforma. Lo siguiente debería ser un buen complemento para cualquier programa de Python:
En esta función, usamos
isinstance(object, classinfo)
para ver si nuestra entrada es astr
en Python 3 o abasestring
en Python 2.fuente
>=
al menos.Forma alternativa para Python 2, sin usar la cadena base:
Pero aún así no funcionará en Python 3 ya
unicode
que no está definido (en Python 3).fuente
Entonces,
Tiene muchas opciones para verificar si su variable es cadena o no:
Este pedido es para un propósito.
fuente
devuelve True
devuelve True
fuente
Aquí está mi respuesta para admitir Python 2 y Python 3 junto con estos requisitos:
six
módulos compatibles o similares, ya que tienden a ocultar lo que se intenta lograr.fuente
Si no desea depender de bibliotecas externas, esto funciona tanto para Python 2.7+ como para Python 3 ( http://ideone.com/uB4Kdc ):
fuente
Simplemente puede usar la función isinstance para asegurarse de que los datos de entrada tengan formato de cadena o unicode . Los siguientes ejemplos lo ayudarán a comprender fácilmente.
fuente
fuente
Así es como lo hago:
fuente
type(str())
es una forma muy indirecta de decirstr
. Los tipos son singletons, por lo quetype(x) is str
es más eficiente.isinstance()
debe usarse en su lugar, a menos que tenga muy buenas razones para ignorar las subclases destr
.He visto:
fuente
fuente
type(thing).__name__ == 'str'
sobretype(thing) == str
oisinstance(thing, str)
? Tampocounicode
existe en las versiones modernas de Python.