"someobj가 아닌 경우 :"가 "if someobj == None :"보다 나은 이유는 무엇입니까?
다음과 같은 몇 가지 코드 예제를 보았습니다.
if not someobj:
#do something
그러나 왜 안하고 있는지 궁금합니다.
if someobj == None:
#do something
차이점이 있습니까? 하나는 다른 것보다 장점이 있습니까?
첫 번째 테스트에서 Python은 객체가 bool
아직 값이 아닌 경우 값으로 변환 하려고 합니다 . 어느 정도, 우리는 목표를 묻습니다 : 당신은 의미가 있습니까? 이 다음 알고리즘을 사용하여 수행합니다.
에 object-
__nonzero__
특수한 메소드 가있는 경우 ( 숫자 내장int
및float
)이 메소드를 호출합니다.bool
직접 사용되는int
값 또는False
0과 같은 경우 고려 되는 값을 리턴해야합니다 .객체가있는 경우 그렇지 않은 경우,
__len__
특별한 방법을 (같은 컨테이너에 내장 된 기능을 수행list
,dict
,set
,tuple
, 그것은 용기를 고려,이 메소드를 호출, ...)False
가 (길이가 제로) 비어있는 경우.않으면 객체 - 오는가 고려가
True
되지 않는 한 객체 - 고려가None
됩니다False
.
두 번째 테스트에서는 동등성이 비교 None
됩니다. 여기서 우리는 "당신은이 다른 가치와 같은가?" 이 다음 알고리즘을 사용하여 수행합니다.
객체에
__eq__
메소드 가있는 경우이 메소드가 호출되고 리턴 값이 값이 변환되어bool
의 결과를 판별하는 데 사용if
됩니다.당신이 원하는 곳에
__cmp__
메소드가 호출됩니다. 이 함수는int
두 가지 순서를 배열합니다 (-1
ifself < other
,0
ifself == other
,+1
ifself > other
)를 반환해야합니다 .즉,
is
운영자에 의해 테스트 될 수있는 객체를 참조한다 .
is
연산자를 사용하여 가능한 또 다른 테스트가 있습니다 . 우리는 그 대상에게 "이 특별한 대상입니까?"라고 물을 것입니다.
일반적으로 숫자가 아닌 확인하는 것이 첫 번째 테스트를 사용하고 동일한 (두 클래스, 두 숫자 등)의 특성 값을 첫 때 동등성 테스트를 사용하고 다음과 같은 경우에 확인하는 것이 좋습니다. 센티넬 값을 사용하여 ( None
예를 들어 부재 필드에 대한 초기화, 또는 사용하지 않을 의미 getattr
또는 __getitem__
메소드).
요약하면 다음과 가변합니다.
>>> class A(object):
... def __repr__(self):
... return 'A()'
... def __nonzero__(self):
... return False
>>> class B(object):
... def __repr__(self):
... return 'B()'
... def __len__(self):
... return 0
>>> class C(object):
... def __repr__(self):
... return 'C()'
... def __cmp__(self, other):
... return 0
>>> class D(object):
... def __repr__(self):
... return 'D()'
... def __eq__(self, other):
... return True
>>> for obj in ['', (), [], {}, 0, 0., A(), B(), C(), D(), None]:
... print '%4s: bool(obj) -> %5s, obj == None -> %5s, obj is None -> %5s' % \
... (repr(obj), bool(obj), obj == None, obj is None)
'': bool(obj) -> False, obj == None -> False, obj is None -> False
(): bool(obj) -> False, obj == None -> False, obj is None -> False
[]: bool(obj) -> False, obj == None -> False, obj is None -> False
{}: bool(obj) -> False, obj == None -> False, obj is None -> False
0: bool(obj) -> False, obj == None -> False, obj is None -> False
0.0: bool(obj) -> False, obj == None -> False, obj is None -> False
A(): bool(obj) -> False, obj == None -> False, obj is None -> False
B(): bool(obj) -> False, obj == None -> False, obj is None -> False
C(): bool(obj) -> True, obj == None -> True, obj is None -> False
D(): bool(obj) -> True, obj == None -> True, obj is None -> False
None: bool(obj) -> False, obj == None -> True, obj is None -> True
이것들은 모두 나쁜 습관입니다. 옛날 옛적에, None과 False 옛날을 취급하는 것이 괜찮은 것입니다. 그러나 표준 2.2 이후는 최선의 정책이 아닙니다.
첫째, if x
또는 if not x
일종의 테스트 를 수행 할 때 파이썬 암시 적은 x
으로 부울 로 CHAPTER 2 해야 우리합니다. bool
함수에 대한 규칙 은 거짓 인 설명합니다. 다른 모든 것은 사실입니다. x의 값이 시작되지 않았는지 정확히 부울이 아니었다면이 암시 적 변환은 실제로 말을하는 가장 명확한 방법이 아닙니다.
Python 2.2 이전에는 bool 함수가 없어 명확하지 않습니다.
둘째, 실제로 == None
. 당신은 is None
하고하고 is not None
있습니다.
PEP 8, Python 코드 용 스타일 가이드를 참조하십시오 .
- Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators. Also, beware of writing "if x" when you really mean "if x is not None" -- e.g. when testing whether a variable or argument that defaults to None was set to some other value. The other value might have a type (such as a container) that could be false in a boolean context!
얼마나 많은 싱글 톤이 있습니까? 다섯 : None
, True
, False
, NotImplemented
와 Ellipsis
. NotImplemented
또는 을 사용하지 않을 가능성이 높고 (단순히 훨씬 더 명확 하기 때문에) Ellipsis
절대로 말하지 않을 if x is True
것이므로 .if x
None
None
거짓으로 생각되는 유일한 것이 아니기 때문 입니다.
if not False:
print "False is false."
if not 0:
print "0 is false."
if not []:
print "An empty list is false."
if not ():
print "An empty tuple is false."
if not {}:
print "An empty dict is false."
if not "":
print "An empty string is false."
False
, 0
, ()
, []
, {}
그리고 ""
모든 다른 None
당신이 개 코드 조각은 그래서, 하지 와 같습니다.
또한 다음 사항을 고려하십시오.
>>> False == 0
True
>>> False == ()
False
if object:
평등 검사 가 아닙니다 . 0
, ()
, []
, None
, {}
,이 등 있습니다 서로 모두 다른, 그들은 모두하지만 평가 허위로.
이것은 다음과 같은 단락 표현있는 "마법"입니다.
foo = bar and spam or eggs
이것은 다음의 약자입니다.
if bar:
foo = spam
else:
foo = eggs
작성해야하지만 :
foo = spam if bar else egg
당신이 많으면
if not spam:
print "Sorry. No SPAM."
스팸 의 __nonzero__ 메소드 가 호출됩니다. Python 매뉴얼에서 :
__nonzero__ ( self ) 진리 값 테스트를 구현하기 위해 호출되고 내장 연산 bool (); False 또는 True 또는 정수 0 또는 1을 반환해야합니다. __len __ ()이 정의 될 경우 호출됩니다 (아래 참조). 클래스가 __len __ () 또는 __nonzero __ ()를 정의하지 않습니다.
당신이 많으면
if spam == None:
print "Sorry. No SPAM here either."
스팸 의 __eq__ 메소드는 None 인수와 함께 호출 됩니다.
사용자 정의 가능성에 대한 자세한 내용은 https://docs.python.org/reference/datamodel.html#basic-customization 에서 Python 문서를 참조하십시오.
PEP 8-표준 코드에 대한 스타일 가이드는 사용에 권장 입니다 또는 아닙니다 당신이 없음 다움을 테스트하는 경우
- Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators.
반면에 이상을 테스트하는 경우 부울 연산자를 사용합니다.
이 두 비교는 서로 다른 목적으로 사용됩니다. 전자는 사례의 부울 값을 확인하고 두 번째는 None 값 ID를 확인합니다.
첫 번째 예는 더 짧고 더 멋지게 시청합니다. 다른 게시물에 따라 선택하는 방법 비교를 통해 수행하려는 작업에 따라.
대답은 "상황에 따라 다르다"입니다.
이 같은에서 0, "", [] 및 False (전체 목록이 아님)가 None에 해당하는 생각하면 첫 번째 예제를 사용합니다.
개인적으로 저는 언어 전반에 걸쳐 일관된 접근 방식을 선택했습니다. if (var)
var가 부울로 선언 된 경우에는 수행됩니다 (또는 이에있는 방식하는 방식) (또는 C에서는 특정 유형이 없음). 여기에서 실수로 다른 유형을 사용하지 않도록하기 위해 변수에 접두사를 붙입니다 b
( bVar
실제로 는 그렇습니다 ).
저는 부울로의 암시 적 캐스팅을 정말 좋아하지 않습니다. 복잡한 규칙이 많을수록 적습니다.
물론 사람들은 동의하지 않을 것입니다. 어떤 if (bVar == true)
것들은 더 멀리 가고, 나는 내 작업에서 자바 코드에서 볼 수있다 (내 취향에 비해 너무 많은 적이다!), 다른 것들은 너무 콤팩트 한 문법을 좋아한다 while (line = getNextLine())
(나에게 너무 모호하다).
'IT' 카테고리의 다른 글
TFS에서 로컬 폴더 삭제 (0) | 2020.07.14 |
---|---|
브라우저 링크-툴바 (0) | 2020.07.14 |
SQL "하위 쿼리에없는 경우 선택"은 결과를 반환하지 않습니다. (0) | 2020.07.14 |
SQLiteDatabase.query 메소드 (0) | 2020.07.14 |
IntelliJ에서 스칼라 식의 유형을 보는 방법 (0) | 2020.07.14 |