J'essaie de vérifier si un dictionnaire est vide mais il ne se comporte pas correctement. Il saute simplement et affiche EN LIGNE sans rien, sauf d'afficher le message. Des idées pourquoi?
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
Prodigue
la source
la source
self.users
n'est pas vide, faites-leif self.users
.isEmpty
retourne réellementTrue
si la première clé fournie par le dictionnaire est vraie et renvoie leFalse
contraire. Si le dictionnaire est vide, il renvoieNone
ce qui ne l'est pas== False
.Réponses:
Les dictionnaires vides sont évalués
False
en Python:Ainsi, votre
isEmpty
fonction n'est pas nécessaire. Il vous suffit de:la source
bool({False: False})
toujours évaluéTrue
. Le lien que vous avez donné correspond à laany
méthode, qui dépend des clés.not <dict>
n'est pas si clair aussiVoici trois façons de vérifier si le dict est vide. Je préfère cependant utiliser la première façon. Les deux autres façons sont beaucoup trop verbeuses.
la source
if x
lorsque x est un tableausi la longueur est nulle signifie que dict est vide
la source
len(dict.keys())
équivaut àlen(dict)
dict.__len__
est probablement un peu plus rapide. :)Voici des moyens simples de vérifier un dict vide:
Bien que la méthode 1 soit plus stricte que lorsque a = None, la méthode 1 fournira un résultat correct mais la méthode 2 donnera un résultat incorrect.
la source
Un dictionnaire peut être automatiquement converti en booléen qui évalue
False
pour un dictionnaire vide etTrue
pour un dictionnaire non vide.Si cela semble trop idiomatique, vous pouvez également tester
len(myDictionary)
pour zéro, ouset(myDictionary.keys())
pour un ensemble vide, ou simplement tester l'égalité avec{}
.La fonction isEmpty n'est pas seulement inutile, mais votre implémentation a également plusieurs problèmes que je peux repérer à première vue.
return False
déclaration est en retrait d'un niveau trop profond. Elle doit être en dehors de la boucle for et au même niveau que l'for
instruction. Par conséquent, votre code ne traitera qu'une seule clé sélectionnée arbitrairement, si une clé existe. Si une clé n'existe pas, la fonction retourneraNone
, qui sera convertie en booléen False. Aie! Tous les dictionnaires vides seront classés comme faux-nagatifs.return False
déclaration et lafor
sortez de la boucle. Ensuite, ce que vous obtenez est le booléen OU de toutes les clés, ouFalse
si le dictionnaire est vide. Vous aurez toujours de faux positifs et de faux négatifs. Effectuez la correction et testez le dictionnaire suivant pour obtenir des preuves.myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}
la source
Vous pouvez également utiliser get (). Au début, je pensais qu'il ne vérifiait que si la clé existait.
Ce que j'aime avec get, c'est qu'il ne déclenche pas d'exception, donc il est facile de parcourir de grandes structures.
la source
Pourquoi ne pas utiliser le test d'égalité?
la source
utilisez «tout»
la source
any
vérifie si le dict contient une clé véridique, par exempleany({0: 'something'})
retourneFalse
même si le dict n'est pas vide