¿Cómo verificar si el tipo de una variable es una cadena?

766

¿Hay alguna manera de verificar si el tipo de una variable en python es un string, como:

isinstance(x,int);

para valores enteros?

c_pleaseUpvote
fuente
11
Lectura obligatoria en isinstance si está aprendiendo python canonical.org/~kragen/isinstance .
Whaley
Ten cuidado con las entradas desde entonces isinstance(True, int) is True.
Albert Tugushev
isinstance(x,str)es correcto en Python 3 (str es un tipo básico).
MasterControlProgram

Respuestas:

1139

En Python 2.x, harías

isinstance(s, basestring)

basestringes la superclase abstracta de stry unicode. Se puede usar para probar si un objeto es una instancia de stro unicode.


En Python 3.x, la prueba correcta es

isinstance(s, str)

La bytesclase no se considera un tipo de cadena en Python 3.

Sven Marnach
fuente
10
@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:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,
André Fratelli
fuente
44
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.
Pi Marillion
65

En Python 3.xo Python 2.7.6

if type(x) == str:
Texom512
fuente
10
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 = 1
if 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')

¡espero que esto ayude!

F. Taylor
fuente
11

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.

if isinstance(target, str) or isinstance(target, unicode):
Wade Hatler
fuente
1
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
except NameError: # 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

isinstance(myvar, basestring)
umläute
fuente
44
O si también quieres atrapar cadenas de bytes:basestring = (str, bytes)
Mark Ransom
10

Python 2/3 incluyendo unicode

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html

crizCraig
fuente
1
¡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.

Para la cadena puedes usar esto

type(s) == type('')
Daniil Grankin
fuente
77
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 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return 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.

duanev
fuente
1
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).

yprez
fuente
7

Entonces,

Tiene muchas opciones para verificar si su variable es cadena o no:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Este pedido es para un propósito.

PatNowak
fuente
5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

devuelve True

type(a) in [str, unicode]

devuelve True

be_good_do_good
fuente
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)
Cas
fuente
1

Si no desea depender de bibliotecas externas, esto funciona tanto para Python 2.7+ como para Python 3 ( http://ideone.com/uB4Kdc ):

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");
mPrinC
fuente
1

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.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True
Hassan Mehmood
fuente
-3
s = '123'
issubclass(s.__class__, str)
vadim vaduxa
fuente
-6

Así es como lo hago:

if type(x) == type(str()):
Usuario
fuente
44
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.
Martijn Pieters
si el tipo (x) es str:
shaurya uppal
-7

He visto:

hasattr(s, 'endswith') 
diente rápido
fuente
-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
Richard Urban
fuente
2
¿En qué caso preferirías type(thing).__name__ == 'str'sobre type(thing) == stro isinstance(thing, str)? Tampoco unicodeexiste en las versiones modernas de Python.
vaultah