Próbuję sprawdzić, czy słownik jest pusty, ale nie działa poprawnie. Po prostu pomija go i wyświetla ONLINE bez niczego oprócz wyświetlania wiadomości. Jakieś pomysły dlaczego?
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
Nie szczędzący czegoś
źródło
źródło
self.users
jest pusta, po prostu zróbif self.users
.isEmpty
faktycznie zwraca,True
jeśli pierwszy klucz uzyskany ze słownika jest prawdziwy i zwracaFalse
inaczej. Jeśli słownik jest pusty, zwraca,None
co nie jest== False
.Odpowiedzi:
Puste słowniki oceniają
False
w Pythonie:Twoja
isEmpty
funkcja jest więc niepotrzebna. Wszystko, co musisz zrobić, to:źródło
bool({False: False})
nadal oceniaTrue
. Podany link odpowiadaany
metodzie, która zależy od kluczy.not <dict>
nie jest to również takie jasneOto trzy sposoby sprawdzenia, czy dykt jest pusty. Wolę jednak używać tylko pierwszego sposobu. Pozostałe dwa sposoby są zbyt trudne.
źródło
if x
gdy x jest tablicąjeśli długość wynosi zero, oznacza to, że dykt jest pusty
źródło
len(dict.keys())
jest równoważne zlen(dict)
dict.__len__
jest prawdopodobnie nieco szybsza. :)Poniżej znajdują się proste sposoby sprawdzenia pustego nagrania:
Chociaż metoda 1 jest bardziej rygorystyczna, niż gdy a = Brak, metoda 1 zapewni poprawny wynik, ale metoda 2 da niepoprawny wynik.
źródło
Słownik może być automatycznie rzutowany na boolean, którego wynikiem jest
False
pusty słownik iTrue
niepusty słownik.Jeśli to wygląda zbyt idiomatycznie, możesz również przetestować
len(myDictionary)
na zero lubset(myDictionary.keys())
na pusty zestaw, lub po prostu przetestować na równość z{}
.Funkcja isEmpty jest nie tylko niepotrzebna, ale także twoja implementacja ma wiele problemów, które mogę rozpoznać na pierwszy rzut oka.
return False
Oświadczenie jest wcięty jeden poziom zbyt głęboko. Powinien znajdować się poza pętlą for i na tym samym poziomie, cofor
instrukcja. W rezultacie Twój kod przetworzy tylko jeden, dowolnie wybrany klucz, jeśli klucz istnieje. Jeśli klucz nie istnieje, funkcja zwróci wartośćNone
, która zostanie przekazana na wartość logiczną False. Auć! Wszystkie puste słowniki zostaną sklasyfikowane jako fałszywe.return False
instrukcji i wyprowadzasz ją pozafor
pętlę. Otrzymasz więc logiczne OR wszystkich kluczy lubFalse
jeśli słownik jest pusty. Nadal będziesz mieć fałszywe pozytywy i fałszywe negatywy. Wykonaj korektę i przetestuj w oparciu o następujący słownik w celu uzyskania dowodów.myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}
źródło
Możesz także użyć get (). Początkowo wierzyłem, że sprawdza tylko, czy klucz istnieje.
To, co lubię w get, to to, że nie wyzwala wyjątku, więc ułatwia przechodzenie przez duże struktury.
źródło
Dlaczego nie skorzystać z testu równości?
źródło
użyj „dowolne”
źródło
any
sprawdza, czy dykta zawiera jakiś prawdziwy klucz, np.any({0: 'something'})
zwraca,False
nawet jeśli