¿Cómo verificar si la cadena está vacía en Python?

7 minutos de lectura

Avatar de usuario de Joan Venge
joan venganza

¿Python tiene algo así como una variable de cadena vacía donde puedes hacer:

if myString == string.empty:

De todos modos, ¿cuál es la forma más elegante de verificar valores de cadena vacíos? Encuentro codificación difícil "" cada vez que comprueba una cadena vacía no es tan buena.

  • Cómo es "" ¿no tan bueno?

    – Sin nombre

    8 de febrero de 2020 a las 23:19

  • Ninguno no coincidirá con “”. Así que depende del contexto en cuanto a lo que quieras.

    – de dónde viene ese nombre

    9 de julio de 2022 a las 17:05

Avatar de usuario de Andrew Clark
andres clark

Las cadenas vacías son “falsas” (pitón 2 o pitón 3 referencia), lo que significa que se consideran falsos en un contexto booleano, por lo que puede hacer esto:

if not myString:

Esta es la forma preferida si sabe que su variable es una cadena. Si su variable también podría ser de otro tipo, entonces debería usar:

if myString == "":

Consulte la documentación sobre Pruebas de valor de verdad para otros valores que son falsos en contextos booleanos.

  • Tenga cuidado, ya que muchas otras cosas también son falsas.

    – Ignacio Vázquez-Abrams

    5 de marzo de 2012 a las 20:11

  • Nunca antes había oído hablar del término falso. ¿Significa que devuelve falso?

    – Joan venganza

    5 de marzo de 2012 a las 20:15

  • @Joan: se evalúa como falso en un contexto booleano.

    – Ignacio Vázquez-Abrams

    5 de marzo de 2012 a las 20:16

  • OP quiere saber si la variable es una cadena vacía, pero también ingresaría el if not myString: bloquear si myString eran None, 0, False etc. Entonces, si no está seguro de qué tipo myString es, deberías usar if myString == "": para determinar si es una cadena vacía en lugar de algún otro valor falso.

    – Andrés Clark

    7 de agosto de 2013 a las 16:08

  • @AndrewClark, para tal caso, en lugar de una cadena de if myString == ... expresiones, podríamos usar if myString in (None, '') o por @Bartek, if myString in (None, '') or not myString.strip()

    – Guiso

    12 de junio de 2015 a las 19:43


avatar de usuario de zenpoy
zenpoy

De PEP 8en el Apartado “Recomendaciones de programación”:

Para secuencias (cadenas, listas, tuplas), use el hecho de que las secuencias vacías son falsas.

Así que deberías usar:

if not some_string:

o:

if some_string:

Solo para aclarar, las secuencias son evaluado a False o True en un contexto booleano si están vacíos o no. Ellos son no es igual a False o True.

  • PD: En defensa del PEP, se podría argumentar que decir “x es falso” (minúsculas FALSO) ya significa que, en lugar de significar x == False. Pero en mi humilde opinión, la aclaración sigue siendo bienvenida dada la audiencia objetivo.

    – Mestre León

    12 de marzo de 2016 a las 16:24


  • if not myString atrapar como vacío esto var='' en pitón 3.8

    – NikSp

    15 de julio de 2022 a las 15:21


Avatar de usuario de Bartek
Bartek

La forma más elegante probablemente sería simplemente verificar si es verdadero o falso, por ejemplo:

if not my_string:

Sin embargo, es posible que desee eliminar los espacios en blanco porque:

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

Sin embargo, probablemente debería ser un poco más explícito en esto, a menos que esté seguro de que esta cadena ha pasado algún tipo de validación y es una cadena que se puede probar de esta manera.

avatar de usuario de rouble
rublo

Probaría la nada antes de desnudarme. Además, usaría el hecho de que las cadenas vacías son falsas (o falsas). Este enfoque es similar a StringUtils.isBlank de Apache o Cuerdas de guayaba.isNullOrEmpty

Esto es lo que usaría para probar si una cadena es Ninguna O Vacío O En blanco:

def isBlank (myString):
    return not (myString and myString.strip())

Y, exactamente lo opuesto a probar si una cadena no es Ninguna NI Vacío NI Espacio en blanco:

def isNotBlank (myString):
    return bool(myString and myString.strip())

avatar de usuario de la bóveda
bóveda

Una vez escribí algo similar a la respuesta de Bartek y javascript inspirado:

def is_not_blank(s):
    return bool(s and not s.isspace())

Prueba:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

  • ¿Por qué no solo return bool(s.strip())

    – anilbey

    3 de marzo de 2020 a las 9:23

  • AttributeError: 'NoneType' object has no attribute 'strip'

    – bóveda

    3 de marzo de 2020 a las 13:04

  • s.strip() asigna una nueva cadena, que es puro desperdicio. Usar string.isspace()

    – Clemente

    22 de junio de 2020 a las 15:27

  • "".isspace() es False

    – Danón

    17 de junio de 2021 a las 13:57

  • @Danon no pasará la primera prueba s and y hará un cortocircuito.

    – Alejandro Surafel

    18 de noviembre de 2021 a las 13:07

Avatar de usuario de Mateen Ulhaq
mateen ulhaq

La única forma realmente sólida de hacer esto es la siguiente:

if "".__eq__(myString):

Todas las demás soluciones tienen posibles problemas y casos extremos en los que la verificación puede fallar.

  • len(myString) == 0 puede fallar si myString es un objeto de una clase que hereda de str y anula el __len__() método.

  • myString == "" y myString.__eq__("") puede fallar si myString anula __eq__() y __ne__().

  • "" == myString también se deja engañar si myString anula __eq__().

  • myString is "" y "" is myString son equivalentes. Ambos fracasarán si myString no es en realidad una cadena sino una subclase de cadena (ambos devolverán False). Además, dado que son verificaciones de identidad, la única razón por la que funcionan es porque Python usa String Pooling (también llamado String Internment) que usa la misma instancia de una cadena si está internada (ver aquí: ¿Por qué comparar cadenas usando ‘= =’ o ‘is’ a veces producen un resultado diferente?). Y "" está internado desde el principio en CPython

    El gran problema con la verificación de identidad es que String Internment es (hasta donde pude encontrar) que no está estandarizado qué cadenas están internadas. Eso significa, teóricamente "" no es necesario internado y eso depende de la implementación.

    Además, comparando cadenas usando is en general, es una trampa bastante mala, ya que a veces funcionará correctamente, pero no en otras ocasiones, ya que la agrupación de cadenas sigue reglas bastante extrañas.

  • Confiar en la falsedad de una cadena puede no funcionar si el objeto anula __bool__().

La única forma de hacer esto que realmente no se puede engañar es la mencionada al principio: "".__eq__(myString). Dado que esto llama explícitamente a la __eq__() método de la cadena vacía no puede ser engañado anulando cualquier método en myString y funciona sólidamente con subclases de str.

Este no es solo un trabajo teórico, sino que en realidad podría ser relevante en el uso real, ya que he visto subclases de marcos y bibliotecas. str antes y usando myString is "" podría devolver una salida incorrecta allí.

Dicho esto, en la mayoría de los casos, todas las soluciones mencionadas funcionarán correctamente. Esta publicación es principalmente trabajo académico.

  • ¿Por qué no solo return bool(s.strip())

    – anilbey

    3 de marzo de 2020 a las 9:23

  • AttributeError: 'NoneType' object has no attribute 'strip'

    – bóveda

    3 de marzo de 2020 a las 13:04

  • s.strip() asigna una nueva cadena, que es puro desperdicio. Usar string.isspace()

    – Clemente

    22 de junio de 2020 a las 15:27

  • "".isspace() es False

    – Danón

    17 de junio de 2021 a las 13:57

  • @Danon no pasará la primera prueba s and y hará un cortocircuito.

    – Alejandro Surafel

    18 de noviembre de 2021 a las 13:07

avatar de usuario de hostingutilities.com
hostingutilities.com

Pruebe la cadena vacía o en blanco (forma más corta):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

  • Si myString = None, generará una excepción. Mejor usa la respuesta de @vault

    – Dominick

    29/10/2016 a las 12:39


  • @Dominik si miCadena isinstance(myString, int) también generará una excepción. ¿Cuál es tu punto? El OP solicitó formas de probar cadenas vacías, su pregunta no incluye la verificación de tipos.

    – Hmerman6006

    17 de diciembre de 2021 a las 12:12

¿Ha sido útil esta solución?