Pregunta ¿La forma más elegante de verificar si la cadena está vacía en Python?


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

if myString == string.empty:

Independientemente de cuál es la forma más elegante de verificar valores de cadena vacíos? Encuentro codificación difícil "" todo el tiempo para comprobar que una cadena vacía no es tan buena.


925
2018-03-05 20:09


origen


Respuestas:


Las cadenas vacías son "falsy" 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 sabes que tu variable es una cadena. Si su variable también podría ser de otro tipo, debería usar myString == "". Ver la documentación en Verificación del valor de la verdad para otros valores que son falsos en contextos booleanos.


1361
2018-03-05 20:10



De PEP 8, en el Sección "Recomendaciones de programación":

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

Entonces 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. Son no es igual a False o True.


286
2018-03-05 20:12



La manera más elegante probablemente sería simplemente verificar si es verdadera o falsa, por ejemplo:

if not my_string:

Sin embargo, es posible que desee quitar el espacio en blanco porque:

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

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


154
2018-03-05 20:11



Yo probaría la nada antes de desnudarme. Además, usaría el hecho de que las cadenas vacías son falsas (o Falsy). Este enfoque es similar a StringUtils.isBlank de Apache o Guava's Strings.isNullOrEmpty

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

def isBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return False
    #myString is None OR myString is empty or blank
    return True

Y, exactamente lo contrario para probar si una cadena no es None NI Empty NI Blank:

def isNotBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return True
    #myString is None OR myString is empty or blank
    return False

Formas más concisas del código anterior:

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

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

54
2017-07-02 14:44



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

def isNotEmpty(s):
    return bool(s and s.strip())

Prueba:

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

25
2018-01-16 11:02



Prueba 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")

11
2018-05-09 07:45



Si desea diferenciar entre cadenas vacías y nulas, le sugiero usar if len(string), de lo contrario, sugeriría usar simplemente if string como otros han dicho. La advertencia sobre cadenas llenas de espacios en blanco todavía se aplica, así que no te olvides de strip.


9
2018-03-05 20:20



a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

6
2017-08-07 15:55



Encuentro hardcoding (sic) "" cada vez para comprobar que una cadena vacía no es tan buena.

Enfoque de código limpio

Haciendo esto: foo == "" es una muy mala práctica. "" es un valor mágico Nunca se debe comparar con valores mágicos (más comúnmente conocidos como números mágicos)

Lo que debe hacer es comparar con un nombre de variable descriptiva.

Nombres de variables descriptivas

Uno puede pensar que "empty_string" es un nombre de variable descriptivo. No es.

Antes de ir y hacer empty_string = "" y piensas que tienes un gran nombre de variable para comparar. Esto no es lo que significa "nombre de variable descriptiva".

Un buen nombre de variable descriptiva se basa en su contexto. Tienes que pensar en lo que es la cadena vacía es.

  • De dónde viene.
  • ¿Por qué está ahí?
  • ¿Por qué necesitas verificarlo?

Ejemplo de campo de formulario simple

Está creando un formulario donde un usuario puede ingresar valores. Desea verificar si el usuario escribió algo o no.

Un buen nombre de variable puede ser not_filled_in

Esto hace que el código sea muy legible

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

Ejemplo completo de análisis de CSV

Estás analizando archivos CSV y quieres que la cadena vacía se analice como None

(Debido a que CSV está completamente basado en texto, no puede representar None sin usar palabras clave predefinidas)

Un buen nombre de variable puede ser CSV_NONE

Esto hace que el código sea fácil de cambiar y adaptar si tiene un nuevo archivo CSV que representa None con otra cadena que ""

if csvfield == CSV_NONE:
    csvfield = None

No hay preguntas sobre si este fragmento de código es correcto. Está bastante claro que hace lo que debería hacer.

Compare esto con

if csvfield == EMPTY_STRING:
    csvfield = None

La primera pregunta aquí es: ¿Por qué la cuerda vacía merece un tratamiento especial?

Esto le diría a los futuros codificadores que una cadena vacía siempre debe considerarse como None.

Esto se debe a que mezcla la lógica de negocios (¿Qué valor de CSV debe ser None) con implementación de código (¿En qué estamos realmente comparando?)

Es necesario que haya un separación de la preocupación entre los dos.


6
2017-10-04 07:35