Program Tip

Python에서 테스트 없음

programtip 2020. 10. 2. 23:06
반응형

Python에서 테스트 없음 [중복]


이 질문에 이미 답변이 있습니다.

이 중 None 테스트가 아닙니다.

if val != None:

if not (val is None):

if val is not None:

어느 것이 더 바람직하며 그 이유는 무엇입니까?


if val is not None:
    # ...

변수가로 설정되지 않았는지 테스트하기위한 Pythonic 관용구입니다 None. 이 관용구는 기본 매개 변수로 키워드 함수를 선언 하는 경우에 특히 사용됩니다 . isPython에서 ID를 테스트합니다. None실행중인 Python 스크립트 / 프로그램 존재하는 인스턴스가 하나뿐이기 때문에 is이를위한 최적의 테스트입니다. 으로 Johnsyweb 지적 ,이 설명되어 PEP 8 "프로그래밍 권장 사항"에서.

이것이 선호되는 이유는

if not (val is None):
    # ...

이것은 단순히 Zen of Python의 일부입니다 : "가독성이 중요합니다." 좋은 파이썬은 종종 좋은 의사 코드에 가깝습니다 .


From, Programming Recommendations, PEP 8 :

None과 같은 싱글 톤에 대한 비교는 항상 'is'또는 'is not'으로 이루어져야하며, 항등 연산자가 아닙니다.

또한 "if x가 None이 아닌 경우"를 의미 할 때 "if x"를 작성하는 것에주의하십시오. 예를 들어 기본값이 None 인 변수 나 인수가 다른 값으로 설정되었는지 여부를 테스트 할 때입니다. 다른 값은 부울 컨텍스트에서 거짓 일 수있는 유형 (예 : 컨테이너)을 가질 수 있습니다!

PEP 8은 모든 Python 프로그래머에게 필수적인 읽기 자료입니다.


후자의 두 가지 중 하나는 전달 될 때 true를 반환 val하도록 정의하는 유형일 수 있으므로 잠재적으로 .__eq__()None


이러한 유형의 질문에 대한 최선의 방법은 파이썬이 정확히 무엇을하는지 보는 것입니다. dis모듈은 매우 유익합니다.

>>> def f(val):
...   if val != None:
...     return True
...   return False
...
>>> def g(val):
...   if not (val is None):
...     return True
...   return False
...
>>> def h(val):
...   if val is not None:
...     return True
...   return False
...
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               3 (!=)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE
>>> dis.dis(h)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE

마지막 두 경우는 동일한 작업 순서로 축소됩니다 (파이썬은 연산자를 읽고 not (val is None)사용합니다 is not). 첫 번째는 !=None과 비교할 때 연산자를 사용합니다 .

다른 답변에서 지적했듯이 !=None과 비교할 때 사용 하는 것은 나쁜 생각입니다.

참고 URL : https://stackoverflow.com/questions/3965104/not-none-test-in-python

반응형