Python에서 테스트 없음 [중복]
이 질문에 이미 답변이 있습니다.
이 중 None 테스트가 아닙니다.
if val != None:
if not (val is None):
if val is not None:
어느 것이 더 바람직하며 그 이유는 무엇입니까?
if val is not None:
# ...
변수가로 설정되지 않았는지 테스트하기위한 Pythonic 관용구입니다 None
. 이 관용구는 기본 매개 변수로 키워드 함수를 선언 하는 경우에 특히 사용됩니다 . is
Python에서 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
'Program Tip' 카테고리의 다른 글
문자열 목록에서 빈 문자열 제거 (0) | 2020.10.02 |
---|---|
모든 예외 포착 정보 (0) | 2020.10.02 |
Rails 4에서 관심사를 사용하는 방법 (0) | 2020.10.02 |
jQuery : 선택한 요소 태그 이름 가져 오기 (0) | 2020.10.02 |
서비스 대 공장에 대해 혼동 (0) | 2020.10.02 |