¿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 los valores de cadena vacíos? Encuentro que la codificación dura ""
cada vez para verificar una cadena vacía no es tan buena.
python
string
comparison-operators
Joan Venge
fuente
fuente
""
no es tan bueno?Respuestas:
Las cadenas vacías son "falsas", lo que significa que se consideran falsas en un contexto booleano, por lo que puede hacer esto:
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 usarla
myString == ""
. Consulte la documentación sobre Pruebas de valor de verdad para ver otros valores que son falsos en contextos booleanos.fuente
if not myString:
bloque simyString
eranNone
,0
,False
etc Así que si usted no está seguro de qué tipomyString
es, se debe utilizarif myString == "":
para determinar si se trata de una cadena vacía en lugar de algún otro valor falso.if myString == ...
expresiones, podríamos usarif myString in (None, '')
o por @Bartek,if myString in (None, '') or not myString.strip()
De PEP 8 , en la sección "Recomendaciones de programación" :
Entonces deberías usar:
o:
Solo para aclarar, las secuencias se evalúan en
False
oTrue
en un contexto booleano si están vacías o no. No son iguales aFalse
oTrue
.fuente
x == False
. Pero en mi humilde opinión, la aclaración sigue siendo bienvenida dada la audiencia objetivo.La forma más elegante probablemente sería simplemente verificar si es verdadero o falso, por ejemplo:
Sin embargo, es posible que desee quitar espacios en blanco porque:
Sin embargo, probablemente debería ser un poco más explícito en esto, a menos que sepa con certeza que esta cadena ha pasado algún tipo de validación y es una cadena que se puede probar de esta manera.
fuente
No probaría nada antes de desnudarme. Además, usaría el hecho de que las cadenas vacías son False (o Falsy). Este enfoque es similar a StringUtils.isBlank de Apache o Strings.isNullOrEmpty de Guava
Esto es lo que usaría para probar si una cadena es Ninguno O Vacío O En Blanco:
Y, exactamente lo contrario para probar si una cadena no es Ninguna NOR Vacío NOR Blanco:
Formas más concisas del código anterior:
fuente
if mystring and not mystring.strip()
?string and not string.isspace()
?def isBlank(s): return not (s and s.strip())
ydef isNotBlank(s): return s and s.strip()
.Una vez escribí algo similar a la respuesta de Bartek y javascript inspirado:
Prueba:
fuente
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
La única forma realmente sólida de hacerlo es la siguiente:
Todas las demás soluciones tienen posibles problemas y casos extremos donde la verificación puede fallar.
len(myString)==0
puede fallar simyString
es un objeto de una clase que heredastr
y anula el__len__()
método.Del mismo modo
myString == ""
ymyString.__eq__("")
puede fallar simyString
anula__eq__()
y__ne__()
.Por alguna razón,
"" == myString
también se deja engañar si semyString
anula__eq__()
.myString is ""
y"" is myString
son equivalentes Ambos fallarán simyString
no es realmente una cadena, sino una subclase de cadena (ambos volveránFalse
). Además, dado que son comprobaciones 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' es 'a veces produce un resultado diferente? ). Y""
es internado desde el principio en CPythonEl gran problema con la verificación de identidad es que String Internment es (por lo que pude encontrar) que no está estandarizado qué cadenas están internadas. Eso significa que, en teoría,
""
no es necesario internado y que depende de la implementación.La única manera de hacer esto que realmente no puede ser engañado es el que se menciona al principio:
"".__eq__(myString)
. Como esto llama explícitamente al__eq__()
método de la cadena vacía, no se puede engañar anulando ningún método en myString y funciona sólidamente con subclases destr
.También confiar en la falsedad de una cadena podría no funcionar si el objeto anula su
__bool__()
método.Este no es solo un trabajo teórico, sino que podría ser relevante en el uso real, ya que he visto subclases de bibliotecas y marcos
str
antes y el usomyString is ""
podría devolver un resultado incorrecto allí.Además, comparar cadenas usando
is
en general es una trampa bastante malvada, ya que funcionará correctamente a veces, pero no en otras, ya que la agrupación de cadenas sigue reglas bastante extrañas.Dicho esto, en la mayoría de los casos, todas las soluciones mencionadas funcionarán correctamente. Esta publicación es principalmente trabajo académico.
fuente
Prueba de cadena vacía o en blanco (forma más corta):
fuente
myString = None
, provocará una excepción. Mejor use la respuesta deSi desea diferenciar entre cadenas vacías y nulas, sugeriría usar
if len(string)
, de lo contrario, sugeriría usar simplementeif string
como otros han dicho. Sin embargo, la advertencia sobre las cadenas llenas de espacios en blanco todavía se aplica, así que no te olvidesstrip
.fuente
if stringname:
da unfalse
cuando la cadena está vacía. Supongo que no puede ser más simple que esto.fuente
Enfoque de código limpio
Hacer esto:
foo == ""
es una muy mala práctica.""
Es un valor mágico. Nunca debe verificar los valores mágicos (más comúnmente conocidos como números mágicos )Lo que debe hacer es compararlo con un nombre de variable descriptivo.
Nombres descriptivos de variables
Uno puede pensar que "cadena_vacía" es un nombre de variable descriptivo. No es .
Antes de ir y hacer
empty_string = ""
y pensar que tiene un gran nombre de variable para comparar. Esto no es lo que significa "nombre de variable descriptivo".Un buen nombre de variable descriptiva se basa en su contexto. Usted tiene que pensar en lo que la cadena vacía es .
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
Ejemplo completo de análisis CSV
Está analizando archivos CSV y desea que la cadena vacía se analice como
None
(Dado que CSV está completamente basado en texto, no puede representarse
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 se representa
None
con otra cadena que no sea""
No hay preguntas sobre si este código es correcto. Está bastante claro que hace lo que debería hacer.
Compara esto con
La primera pregunta aquí es: ¿por qué la cadena 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 combina la lógica empresarial (cuál debería ser el valor CSV
None
) con la implementación del código (con qué nos estamos comparando)Es necesario que haya una separación de preocupación entre los dos.
fuente
""
no es un valor mágico, mismo queTrue
,False
oNone
no son valores mágicos.fuente
a='a'
, obtendríaa.isspace() -> False
, peroa
no sería en esa cuenta una cadena vacía.¿Qué tal esto? Quizás no sea "el más elegante", pero parece bastante completo y claro:
fuente
En respuesta a @ 1290. Lo sentimos, no hay forma de formatear bloques en los comentarios. El
None
valor no es una cadena vacía en Python, y tampoco lo es (espacios). La respuesta de Andrew Clark es el correcto:if not myString
. La respuesta de @rouble es específica de la aplicación y no responde la pregunta del OP. Tendrás problemas si adoptas una definición peculiar de lo que es una cadena "en blanco". En particular, el comportamiento estándar es questr(None)
produce'None'
una cadena no en blanco.Sin embargo, si debe tratar
None
y (espacios) como cadenas "en blanco", esta es una mejor manera:Ejemplos:
Cumple los requisitos de @rouble sin romper el
bool
comportamiento esperado de las cadenas.fuente
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Me parece elegante, ya que se asegura de que sea una cuerda y comprueba su longitud:
fuente
-O
marcador o configuras laPYTHONOPTIMIZE
variable env.Otra forma fácil podría ser definir una función simple:
fuente
Esta expresión es verdadera para las cadenas que están vacías. Las cadenas no vacías, Ninguna y los objetos que no son cadenas producirán Falso, con la advertencia de que los objetos pueden anular __str__ para frustrar esta lógica al devolver un valor falso.
fuente
Puede echar un vistazo a esta Asignación de valor o cadena vacía en Python
Se trata de comparar cadenas que están vacías. Entonces, en lugar de probar el vacío con
not
, puede probar si su cadena es igual a una cadena vacía con""
la cadena vacía ...fuente
Para aquellos que esperan un comportamiento como Apache StringUtils.isBlank o Guava Strings.isNullOrEmpty :
fuente
Cuando esté leyendo un archivo por líneas y quiera determinar qué línea está vacía, asegúrese de usarla
.strip()
, porque hay un nuevo carácter de línea en la línea "vacía":fuente
fuente
Si solo usas
no es posible diferenciar una variable que es booleana
False
de una cadena vacía''
:Sin embargo, si agrega una condición simple a su script, la diferencia se hace:
fuente
En caso de que esto sea útil para alguien, aquí hay una función rápida que desarrollé para reemplazar cadenas en blanco con N / A en listas de listas (python 2).
Esto es útil para publicar listas de listas en una base de datos mysql que no acepta espacios en blanco para ciertos campos (campos marcados como NN en el esquema. En mi caso, esto se debió a una clave primaria compuesta).
fuente
Experimenté un poco con cadenas como '', '', '\ n', etc. Quiero que isNotWhitespace sea True si y solo si la variable foo es una cadena con al menos un carácter que no es un espacio en blanco. Estoy usando Python 3.6. Esto es lo que terminé con:
Envuelva esto en una definición de método si lo desea.
fuente
Como prmatta publicado anteriormente, pero con error.
fuente
""
y" "
y False para"a"
(tal y como se esperaba). Su código devuelve lo mismo, excepto por la cadena vacía que devuelve True, lo que no debería.