Ich versuche zu überprüfen, ob ein Wörterbuch leer ist, aber es verhält sich nicht richtig. Es überspringt es einfach und zeigt ONLINE an, ohne die Nachricht anzuzeigen. Irgendwelche Ideen warum?
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
Schonungslos
quelle
quelle
self.users
nicht leer ist, tun Sie es einfachif self.users
.isEmpty
kehren tatsächlich zurück,True
wenn der erste aus dem Wörterbuch ermittelte Schlüssel wahr ist, und gebenFalse
andernfalls zurück. Wenn das Wörterbuch leer ist, wird zurückgegeben,None
was nicht der Fall ist== False
.Antworten:
Leere Wörterbücher werden
False
in Python ausgewertet :Somit ist Ihre
isEmpty
Funktion nicht erforderlich. Alles was Sie tun müssen ist:quelle
bool({False: False})
noch zu bewertenTrue
. Der von Ihnen angegebene Link entspricht derany
Methode, die von den Schlüsseln abhängt.not <dict>
nicht so klarHier sind drei Möglichkeiten, wie Sie überprüfen können, ob das Diktat leer ist. Ich bevorzuge jedoch nur den ersten Weg. Die anderen beiden Wege sind viel zu wortreich.
quelle
if x
schlägt der erste Code fehl, wenn x ein numpy-Array istWenn die Länge Null ist, bedeutet dies, dass das Diktat leer ist
quelle
len(dict.keys())
entsprichtlen(dict)
dict.__len__
wahrscheinlich etwas schneller ist. :)Im Folgenden finden Sie einfache Möglichkeiten, ein leeres Diktat zu überprüfen:
Obwohl Methode 1 strenger ist als wenn a = Keine, liefert Methode 1 das richtige Ergebnis, Methode 2 liefert jedoch ein falsches Ergebnis.
quelle
Ein Wörterbuch kann automatisch in einen Booleschen Wert umgewandelt werden, der
False
für ein leeres Wörterbuch undTrue
für ein nicht leeres Wörterbuch ausgewertet wird .Wenn dies zu idiomatisch aussieht, können Sie auch
len(myDictionary)
auf Null oderset(myDictionary.keys())
eine leere Menge testen oder einfach auf Gleichheit mit testen{}
.Die isEmpty-Funktion ist nicht nur unnötig, sondern Ihre Implementierung weist auch mehrere Probleme auf, die ich auf den ersten Blick erkennen kann.
return False
Aussage ist eine Ebene zu tief eingerückt. Es sollte sich außerhalb der for-Schleife befinden und auf derselben Ebene wie diefor
Anweisung liegen. Infolgedessen verarbeitet Ihr Code nur einen willkürlich ausgewählten Schlüssel, wenn ein Schlüssel vorhanden ist. Wenn kein Schlüssel vorhanden ist, wird die Funktion zurückgegebenNone
, die in boolean False umgewandelt wird. Autsch! Alle leeren Wörterbücher werden als falsch-nagativ eingestuft.return False
Anweisung und bringen ihn außerhalb derfor
Schleife. Dann erhalten Sie das boolesche ODER aller Schlüssel oderFalse
wenn das Wörterbuch leer ist. Trotzdem werden Sie falsch positive und falsch negative Ergebnisse haben. Führen Sie die Korrektur durch und testen Sie sie anhand des folgenden Wörterbuchs, um Beweise zu erhalten.myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}
quelle
Sie können auch get () verwenden. Anfangs glaubte ich, nur zu prüfen, ob der Schlüssel existiert.
Was ich mit get mag, ist, dass es keine Ausnahme auslöst, so dass es einfach ist, große Strukturen zu durchqueren.
quelle
Warum nicht den Gleichstellungstest verwenden?
quelle
benutze 'any'
quelle
any
prüft, ob das Diktat einen wahrheitsgemäßen Schlüssel enthält, z. B.any({0: 'something'})
kehrt zurückFalse
, obwohl das Diktat nicht leer ist