Я пытаюсь проверить, является ли словарь пустым, но он не ведет себя должным образом. Он просто пропускает его и отображает онлайн без чего-либо, кроме отображения сообщения. Есть идеи почему?
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
беспощадный
источник
источник
self.users
не пусто, просто сделайтеif self.users
.isEmpty
фактически возвращается,True
если первый ключ, полученный из словаря, является истинным и возвращаетFalse
иначе. Если словарь пуст, он возвращаетNone
что нет== False
.Ответы:
Пустые словари оцениваются
False
в Python:Таким образом, ваша
isEmpty
функция не нужна. Все, что вам нужно сделать, это:источник
bool({False: False})
прежнему оценивается какTrue
. Ссылка, которую вы дали, соответствуетany
методу, который зависит от ключей.not <dict>
это не так ясноВот три способа проверить, является ли dict пустым. Я предпочитаю использовать только первый способ. Два других способа слишком многословны.
источник
if x
когда x это пустой массивесли длина равна нулю, значит, что dict пуст
источник
len(dict.keys())
эквивалентноlen(dict)
dict.__len__
вероятно, немного быстрее. :)Простые способы проверить пустой dict ниже:
Хотя метод 1 более строгий, чем когда a = None, метод 1 даст правильный результат, но метод 2 даст неправильный результат.
источник
Словарь может быть автоматически приведен к логическому значению, которое оценивается как
False
для пустого словаря иTrue
для непустого словаря.Если это выглядит слишком идиоматично, вы также можете проверить
len(myDictionary)
на ноль, илиset(myDictionary.keys())
на пустой набор, или просто проверить на равенство с{}
.Функция isEmpty не только не нужна, но и ваша реализация имеет множество проблем, которые я могу заметить prima-facie.
return False
Заявление отступ на один уровень слишком глубоко. Он должен находиться вне цикла for и на том же уровне, что иfor
оператор. В результате ваш код будет обрабатывать только один, произвольно выбранный ключ, если ключ существует. Если ключ не существует, функция вернетсяNone
, что будет приведено к логическому значению False. Ой! Все пустые словари будут классифицированы как ложные слова.return False
заявлении и вывели его за пределыfor
цикла. Тогда вы получите логическое ИЛИ всех ключей илиFalse
словарь пустой. Тем не менее у вас будут ложные срабатывания и ложные отрицания. Сделайте исправление и проверьте следующий словарь для доказательства.myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}
источник
Вы также можете использовать get (). Первоначально я верил, что нужно только проверить, существует ли ключ.
Что мне нравится в get, так это то, что он не вызывает исключение, поэтому он позволяет легко проходить через большие структуры.
источник
Почему бы не использовать тест на равенство?
источник
используйте «любой»
источник
any
проверяет, содержит ли dict какой-либо правдивый ключ, напримерany({0: 'something'})
возвращает,False
даже если dict не пуст