2011-08-22 7 views
26

저는 항상 if not value의 스타일로 코딩했습니다. 그러나이 스타일이 작동하는 동안 몇 가지 가이드가 두 가지 잠재적 인 문제가있는 것으로 보입니다 :파이썬 : val이 아니라면 val, 그렇지 않으면 val은 없음

  1. 완전히 읽을 수는 없습니다. if value is None은 분명히 이해할 수 있습니다.
  2. []0과 같은 항목은 False으로 평가되므로 나중에 영향을 미칠 수 있습니다 (미묘한 버그가 발생할 수 있음).

는 또한 같은 다른 비교,이 아이디어를 적용하기 시작하고있다 :

  • if not value

if value is []

  • if not valueif value is False 대 그리고 목록에갑니다 ...

    질문은 p와 얼마나 멀리 가고 있습니까? 법령? 코드를 안전하게 유지하면서 어디에서 선을 그어야합니까?

    무엇을 상관없이 항상 if value is None 스타일을 사용해야합니까?

  • +0

    비단뱀 작성 분야 중 하나는 ** 오리 ** 입력입니다. 'None', '[]', '0' 등의 의미는'아무것도 보이지 않는다면 아무 것도하지 않습니다. 아무것도 테스트하지 않습니다. '테스트 된 값에 대해 더 명료하게 표현할 필요가 있다면 '=='. – nagisa

    답변

    11

    원하는 경우 원하는 경우 없음과 비교하십시오. 값이 false (빈 목록, 없음, 거짓)로 간주되는지 확인하려는 경우 "값이 아닌 경우"를 사용하십시오.

    "가치가 없다면"깨끗하게 보이고 Pythonic으로 나타납니다.

    또한 목록에주의하십시오. 빈 목록을 비교할 때는 is를 사용하면 안됩니다. 목록을 얻었음을 알고 있다면 "if"를 사용하여 내용이 있는지 확인하십시오 (또는 len()). 인터프리터에이를 입력하십시오 :

    >>> a = [] 
    >>> a is [] 
    False 
    

    방금 ​​만든 임시 목록은 'A'에 저장된 것보다 메모리에서 다른 주소를 가지고 있기 때문입니다. None, False 또는 True로 표시되지 않습니다. 이러한 값은 모두 singleton (모든 값이 동일한 메모리 섹션을 참조 함)이므로 'is'키워드를 사용하면됩니다.

    CPython 인턴 문자열도 있으므로 다음과 같이 작동합니다.

    >>> 'a' is 'a' 
    True 
    

    당신은 이에 의존하지한다. 구현 세부 사항이며 모든 Python 버전에서 작동하도록 지정되지 않았습니다.

    +0

    잘 잡습니다. 'is' 연산자에 대해서 새로운 것을 배웠습니다. :) 조금 더 연구 한 결과''없다 ''는'0'과'[]'와'False'와 같은 것으로 적절하고'None'의 경우'값이 없음 '이라고 알았습니다. '그렇지 않다면'은 항상 부울이지만 '없음'에 대한 '그렇지 않다'는 다른 이야기이므로 '값이 없음'인 경우 의미가 있습니다. :) –

    16

    아니요. 값이 거짓 일 때 코드를 실행하고 None이 아닌 경우 코드를 실행하는 것이 끔찍한 일입니다.

    None 개체와 신원을 확인하려면 is None을 사용하십시오. 값을 False로 지정하려면 not value을 사용하십시오.

    1

    내 대답은 간단합니다. 대부분의 코딩 문제에 적용됩니다. 작동하는 무언가를 쓰려고하지 마십시오. 최대한 명확하게 의사를 표명하도록 노력하십시오. 값이 false인지 확인하려면 if not value을 사용하십시오. None을 확인하려면 적어 두십시오. 그것은 항상 상황과 당신의 판단에 달려 있습니다.

    생각없이 적용 할 수있는 규칙을 찾으려는 시도해서는 안됩니다. 이러한 규칙을 찾으면 컴퓨터를위한 일입니다. 인간을 위해서도! ;-)

    1
    if not value: 
        pass 
    

    은 "pythonic"입니다. 그것은 미묘한 버그를 일으키지 않습니다, 규칙은 명시 적이며 (찾을 수 있습니다) easy to understand. 당신이 사용 된 바와 같이

    당신은 거짓과 없음을 구별해야하는 경우

    는 :

    if not value is None: # or False, or == [], etc. 
        pass 
    

    을 그래도 위의 거의 필요를 찾을 수 있습니다.

    그러나 일반적으로 양성 조건을 만드는 것이 바람직합니다. 그들은 한 눈에 이해하기 쉽고 복잡성이 증가함에 따라 견디기 쉽습니다 (언제나처럼 보입니다).

    if value: 
        pass 
    else: 
        pass 
    
    +0

    그것이 내가 미묘한 버그를 일으킬 수 있다고 말한 이유입니다. 차라리 자세히 설명하지는 않겠지 만,이 [post] (http://boodebr.org/main/python/tourist/none-empty-nothing)에서 설명해야합니다. :) –

    +0

    사과,하지만 당신은 올바른 테스트를 결정하고 적용해야합니다. 링크 된 블로그 게시물은 파이썬의 진실 테스트 규칙을 이해하지 못하고 대신 C를 사용하려는 사람이 있습니다. "미묘한"버그는 규칙을 이해하지 못할 때 발생합니다. –

    4

    is 연산자의 사용에는 약간의 문제가 있습니다. if value is []은 동일한 허위 목록이 없기 때문에 항상 거짓이됩니다.None은 싱글 톤이므로 (None은 모두 동일한 개체 임), 다른 비교에서는 ==을 사용하므로 None과 잘 작동합니다.

    그러나 if valueif not value은 완벽하게 읽기 쉽고 유용합니다. IMHO 0과 None을 구분할 때와 같이 다양한 유형의 진실 또는 위변조 값을 다르게 처리해야하는 경우가 아니면 구체화 할 필요가 없습니다.

    관련 문제