辞書が空かどうかを調べようとしていますが、正しく動作しません。それは単にそれをスキップしてメッセージを表示する以外何もせずに _ online _ を表示します。何かアイディアは?
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ではFalse
に評価されます。
>>> dct = {}
>>> bool(dct)
False
>>> not dct
True
>>>
したがって、あなたのisEmpty
関数は不要です。あなたがする必要があるのは、
def onMessage(self, socket, message):
if not self.users:
socket.send("Nobody is online, please use REGISTER command" \
" in order to register into the server")
else:
socket.send("ONLINE " + ' ' .join(self.users.keys()))
Dictが空かどうかを確認する方法は3つあります。私は最初の方法を使うことを好みます。他の2つの方法は、やり過ぎです。
test_dict = {}
if not test_dict:
print "Dict is Empty"
if not bool(test_dict):
print "Dict is Empty"
if len(test_dict) == 0:
print "Dict is Empty"
dict = {}
print(len(dict.keys()))
長さがゼロの場合、辞書は空です。
辞書は自動的にブール値にキャストされ、空の辞書の場合はFalse
に、空でない辞書の場合はTrue
に評価されます。
if myDictionary: non_empty_clause()
else: empty_clause()
これがあまりにも慣れていない場合は、len(myDictionary)
をゼロでテストするか、set(myDictionary.keys())
を空のセットでテストするか、単に{}
で同等性をテストすることもできます。
IsEmpty関数は不要なだけではなく、あなたの実装にも問題がいくつかあります。
return False
ステートメントは、1レベルインデントされています。 forループの外側で、for
ステートメントと同じレベルになければなりません。その結果、キーが存在する場合、コードは任意に選択された1つのキーのみを処理します。キーが存在しない場合、関数はNone
を返します。これはブール値のFalseにキャストされます。痛い!空の辞書はすべて偽陰性として分類されます。return False
ステートメントのインデントを修正し、それをfor
ループの外側に持ってくるとしましょう。そうすると、すべてのキーのブール値 _または_ 、あるいは辞書が空の場合はFalse
が得られます。それでもあなたは誤検知と誤検知をするでしょう。証拠を得るために以下の辞書に対して修正とテストをしてください。myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty Tuple'}
Python 3:
def is_empty(dict):
if not bool(dict):
return True
return False
test_dict = {}
if is_empty(test_dict):
print("1")
test_dict = {"a":123}
if not is_empty(test_dict):
print("1")
空の辞書をチェックする簡単な方法は以下の通りです:
a= {}
1. if a == {}:
print ('empty dict')
2. if not a:
print ('empty dict')
方法1は、a = Noneの場合よりも厳密ですが、方法1では正しい結果が得られますが、方法2では誤った結果が得られます。