파이썬 : ‘사전’이 비어 있는지 확인하면 작동하지 않는 것 같습니다. onMessage(self, socket, message): if self.isEmpty(self.users)

사전이 비어 있는지 확인하려고하지만 제대로 작동하지 않습니다. 그냥 건너 뛰고 메시지를 표시하는 것을 제외 하고는 온라인 으로 표시합니다. 왜 어떤 아이디어?

 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())) 


답변

빈 사전 은 파이썬에서 평가됩니다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이 비어 있는지 확인할 수있는 세 가지 방법이 있습니다. 그래도 첫 번째 방법을 선호합니다. 다른 두 가지 방법은 너무 장황합니다.

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()))

길이가 0이면 dict가 비어 있음을 의미합니다.


답변

빈 dict를 확인하는 간단한 방법은 다음과 같습니다.

        a= {}

    1. if a == {}:
           print ('empty dict')
    2. if not a:
           print ('empty dict')

방법 1st가 a = None 인 경우보다 더 엄격하지만 방법 1은 올바른 결과를 제공하지만 방법 2는 잘못된 결과를 제공합니다.


답변

사전은 False빈 사전 및 비어 있지 않은 사전으로 평가되는 부울로 자동 캐스트 될 수 있습니다 True.

if myDictionary: non_empty_clause()
else: empty_clause()

이것이 너무 관용적으로 보이지 않으면 len(myDictionary)0 또는 set(myDictionary.keys())빈 세트를 테스트하거나과의 동등성을 테스트 할 수도 있습니다 {}.

isEmpty 함수는 불필요 할뿐만 아니라 구현에 prima-facie를 발견 할 수있는 여러 문제가 있습니다.

  1. return False문장은 한 단계 너무 깊이 들여 쓰기되었습니다. for 루프 외부에 있어야하며 for명령문 과 같은 레벨에 있어야 합니다. 결과적으로, 키가 존재하는 경우 코드는 임의로 선택된 하나의 키만 처리합니다. 키가 존재하지 않으면이 함수는를 반환 None하고 부울 False로 캐스트됩니다. 아야! 빈 사전은 모두 거짓 음성으로 분류됩니다.
  2. 사전이 비어 있지 않으면 코드는 하나의 키만 처리하고 캐스트 된 값을 부울로 리턴합니다. 호출 할 때마다 동일한 키가 평가된다고 가정 할 수도 없습니다. 따라서 오 탐지가있을 것입니다.
  3. return False명령문 의 들여 쓰기를 정정 하고 for루프 외부로 가져 오십시오 . 그런 다음 모든 키 의 부울 OR 또는False 사전이 비어있는 경우입니다. 여전히 당신은 오탐과 오탐을 가질 것입니다. 증거를 찾기 위해 다음 사전에 대해 정정하고 테스트하십시오.

myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}


답변

get ()을 사용할 수도 있습니다. 처음에는 키가 있는지 확인하는 것만 믿었습니다.

>>> d = { 'a':1, 'b':2, 'c':{}}
>>> bool(d.get('c'))
False
>>> d['c']['e']=1
>>> bool(d.get('c'))
True

get과 함께 좋아하는 것은 예외가 발생하지 않으므로 큰 구조를 쉽게 통과 할 수 있다는 것입니다.


답변

평등 테스트를 사용하지 않는 이유는 무엇입니까?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")