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.
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 simyString
eranNone
,0
,False
etc. Entonces, si no está seguro de qué tipomyString
es, deberías usarif 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 usarif myString in (None, '')
o por @Bartek,if myString in (None, '') or not myString.strip()
– Guiso
12 de junio de 2015 a las 19:43
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 estovar=''
en pitón 3.8– NikSp
15 de julio de 2022 a las 15:21
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.
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())
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. Usarstring.isspace()
– Clemente
22 de junio de 2020 a las 15:27
-
"".isspace()
esFalse
– 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
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 simyString
es un objeto de una clase que hereda destr
y anula el__len__()
método. -
myString == ""
ymyString.__eq__("")
puede fallar simyString
anula__eq__()
y__ne__()
. -
"" == myString
también se deja engañar simyString
anula__eq__()
. -
myString is ""
y"" is myString
son equivalentes. Ambos fracasarán simyString
no es en realidad una cadena sino una subclase de cadena (ambos devolveránFalse
). 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 CPythonEl 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. Usarstring.isspace()
– Clemente
22 de junio de 2020 a las 15:27
-
"".isspace()
esFalse
– 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
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
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