¿Cómo puedo verificar si un objeto Python es una cadena (ya sea regular o Unicode)?
python
string
types
compatibility
Matt S.
fuente
fuente
Respuestas:
Python 2
Úselo
isinstance(obj, basestring)
para un objeto a pruebaobj
.Doc .
fuente
Python 2
Para verificar si un objeto
o
es un tipo de cadena de una subclase de un tipo de cadena:porque ambos
str
yunicode
son subclases debasestring
.Para verificar si el tipo de
o
es exactamentestr
:Para verificar si
o
es una instanciastr
o alguna subclase destr
:Lo anterior también funciona para cadenas Unicode si lo reemplaza
str
conunicode
.Sin embargo, es posible que no necesite hacer una verificación de tipo explícita en absoluto. "Escribir pato" puede satisfacer sus necesidades. Ver http://docs.python.org/glossary.html#term-duck-typing .
Consulte también ¿Cuál es la forma canónica de verificar el tipo en Python?
fuente
basestring
Debe verificar en py2.Python 3
En Python 3.x
basestring
ya no está disponible, al igualstr
que el único tipo de cadena (con la semántica de Python 2.xunicode
).Entonces, la comprobación en Python 3.x es solo:
Esto sigue la solución de la
2to3
herramienta de conversión oficial : la conversiónbasestring
astr
.fuente
Python 2 y 3
(compatible con la cruz)
Si desea verificar sin tener en cuenta la versión de Python (2.x vs 3.x), use
six
( PyPI ) y sustring_types
atributo:Dentro de
six
(un módulo de un solo archivo muy ligero), simplemente está haciendo esto :fuente
future
( PyPI ) para incluso mantener el nombre:from past.builtins import basestring
basestring
y luego vuelva astr
. Por ejemplodef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Encontré esto y más
pythonic
:dado que los objetos de tipo son singleton, se puede usar para comparar el objeto con el tipo str
fuente
isinstance(obj_to_test, str)
obviamente está destinado a probar el tipo, y tiene la ventaja de usar el mismo procedimiento que para otros casos no str.Si uno quiere mantenerse alejado de explícita el tipo de comprobación (y no son probablemente la parte buenas razones para permanecer lejos de ella), más segura del protocolo cadena a cheque es:
No iterará a través de un iterador o iterador, no llamará a una lista de cadenas una cadena y detecta correctamente una cadena como una cadena.
Por supuesto que hay inconvenientes. Por ejemplo,
str(maybe_string)
puede ser un cálculo pesado. Como tantas veces, la respuesta es que depende .EDITAR: como @Tcll señala en los comentarios, la pregunta realmente pide una forma de detectar tanto cadenas unicode como cadenas de bytes. En Python 2, esta respuesta fallará con una excepción para las cadenas unicode que contienen caracteres no ASCII, y en Python 3 devolverá
False
todas las cadenas de bytes.fuente
b = b'test'; r = str(b) == b
dondeb
contiene los mismos datosstr(b)
pero (al ser un objeto de bytes) no se valida como una cadena.Para verificar si su variable es algo que podría usar:
La salida de isistance le dará un valor booleano verdadero o falso para que pueda ajustar en consecuencia. Puede verificar el acrónimo esperado de su valor usando inicialmente: tipo (s) Esto le devolverá el tipo 'str' para que pueda usarlo en la función de resistencia.
fuente
Podría lidiar con esto en el estilo de escritura de pato, como mencionan otros. ¿Cómo sé que una cadena es realmente una cadena? bueno, obviamente al convertirlo en una cadena!
Si el argumento ya es una cadena o un tipo unicode, real_word mantendrá su valor sin modificar. Si el objeto pasado implementa un
__unicode__
método, que se utiliza para obtener su representación unicode. Si el objeto pasado no se puede usar como una cadena, el valorunicode
incorporado genera una excepción.fuente
será True si su objeto es realmente un tipo de cadena. 'str' es una palabra reservada.
Mis disculpas, la respuesta correcta es usar 'basetring' en lugar de 'str' para que también incluya cadenas unicode, como se señaló anteriormente por uno de los otros respondedores.
fuente
Esta tarde me encontré con una situación en la que pensé que iba a tener que verificar el
str
tipo, pero resultó que no.Mi enfoque para resolver el problema probablemente funcionará en muchas situaciones, por lo que lo ofrezco a continuación en caso de que otras personas que lean esta pregunta estén interesadas (solo Python 3).
Algunas pruebas:
fuente
Es simple, use el siguiente código (asumimos que el objeto mencionado es obj):
fuente
Puede probarlo concatenando con una cadena vacía:
Editar :
Corregir mi respuesta después de comentarios que señalan que esto falla con las listas
fuente
Para un buen enfoque de tipeo de pato para me gusta de cadenas que tiene la ventaja de trabajar con Python 2.xy 3.x:
wisefish estaba cerca del tipeo de patos antes de cambiar al
isinstance
enfoque, excepto que+=
tiene un significado diferente para las listas que el que+
tiene.fuente
isalpha
, pero ¿quién sabe qué métodos sería seguro buscar?__str__
método más la igualdad en realidad puede ser el infalible. Pero incluso eso no está exento de advertencias.try
puede ser más rápido. Si lo espera el 99% del tiempo, tal vez no. La diferencia de rendimiento es mínima, es mejor ser idiomático a menos que perfiles tu código y lo identifiques como lento.de EDX - curso en línea MITx: 6.00.1x Introducción a la informática y programación usando Python
fuente
str
!