Estoy tratando de verificar si un diccionario está vacío pero no se comporta correctamente. Simplemente lo omite y muestra EN LÍNEA sin nada más que mostrar el mensaje. Alguna idea de por qué?
def isEmpty(self, dictionary):
for element in dictionary:
if element:
return True
return False
def onMessage(self, socket, message):
if self.isEmpty(self.users) == False:
socket.send("Nobody is online, please use REGISTER command" \
" in order to register into the server")
else:
socket.send("ONLINE " + ' ' .join(self.users.keys()))
python
dictionary
Despiadado
fuente
fuente
self.users
no está vacío, solo hazloif self.users
.isEmpty
realidad devuelveTrue
si la primera clave, producido a partir del diccionario es truey y vuelveFalse
otra manera. Si el diccionario está vacío, devuelve elNone
que no lo está== False
.Respuestas:
Los diccionarios vacíos evalúan
False
en Python:Por lo tanto, su
isEmpty
función es innecesaria. Todo lo que necesitas hacer es:fuente
bool({False: False})
aún se evalúaTrue
. El enlace que proporcionó corresponde alany
método, que depende de las claves.not <dict>
no está tan claro tambiénAquí hay tres formas de verificar si dict está vacío. Sin embargo, prefiero usar la primera manera. Las otras dos formas son demasiado prolijas.
fuente
if x
cuando x sea una matrizsi la longitud es cero significa que dict está vacío
fuente
len(dict.keys())
es equivalente alen(dict)
dict.__len__
es probablemente un poco más rápida. :)A continuación se muestran formas simples de verificar un dict vacío:
Aunque el primer método es más estricto que cuando a = Ninguno, el método 1 proporcionará un resultado correcto, pero el método 2 dará un resultado incorrecto.
fuente
Un diccionario se puede convertir automáticamente a booleano, que se evalúa como
False
para diccionario vacío yTrue
para diccionario no vacío.Si esto parece demasiado idiomático, también puede probar
len(myDictionary)
cero oset(myDictionary.keys())
un conjunto vacío, o simplemente probar la igualdad con{}
.La función isEmpty no solo es innecesaria, sino que su implementación tiene múltiples problemas que puedo detectar a primera vista.
return False
declaración está sangrada un nivel demasiado profundo. Debe estar fuera del ciclo for y al mismo nivel que lafor
instrucción. Como resultado, su código procesará solo una clave, seleccionada arbitrariamente, si existe una clave. Si no existe una clave, la función volveráNone
, que se convertirá en booleano False. ¡Ay! Todos los diccionarios vacíos se clasificarán como falsos negativos.return False
declaración y lafor
saca del ciclo. Entonces, lo que obtienes es el OR booleano de todas las claves, oFalse
si el diccionario está vacío. Aún así tendrás falsos positivos y falsos negativos. Haga la corrección y pruebe contra el siguiente diccionario en busca de evidencia.myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}
fuente
También puedes usar get (). Inicialmente creía que solo verificaba si existía la clave.
Lo que me gusta de get es que no desencadena una excepción, por lo que es fácil atravesar grandes estructuras.
fuente
¿Por qué no usar la prueba de igualdad?
fuente
usar cualquier'
fuente
any
comprueba si el dict contiene alguna clave verdadera, por ejemplo,any({0: 'something'})
regresaFalse
aunque el dict no esté vacío