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.usersno está vacío, solo hazloif self.users.isEmptyrealidad devuelveTruesi la primera clave, producido a partir del diccionario es truey y vuelveFalseotra manera. Si el diccionario está vacío, devuelve elNoneque no lo está== False.Respuestas:
Los diccionarios vacíos evalúan
Falseen Python:Por lo tanto, su
isEmptyfunción es innecesaria. Todo lo que necesitas hacer es:fuente
bool({False: False})aún se evalúaTrue. El enlace que proporcionó corresponde alanymé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 xcuando 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
Falsepara diccionario vacío yTruepara 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 Falsedeclaración está sangrada un nivel demasiado profundo. Debe estar fuera del ciclo for y al mismo nivel que laforinstrucció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 Falsedeclaración y laforsaca del ciclo. Entonces, lo que obtienes es el OR booleano de todas las claves, oFalsesi 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
anycomprueba si el dict contiene alguna clave verdadera, por ejemplo,any({0: 'something'})regresaFalseaunque el dict no esté vacío