IT

"someobj가 아닌 경우 :"가 "if someobj == None :"보다 나은 이유는 무엇입니까?

lottoking 2020. 7. 14. 07:57
반응형

"someobj가 아닌 경우 :"가 "if someobj == None :"보다 나은 이유는 무엇입니까?


다음과 같은 몇 가지 코드 예제를 보았습니다.

if not someobj:
    #do something

그러나 왜 안하고 있는지 궁금합니다.

if someobj == None:
    #do something

차이점이 있습니까? 하나는 다른 것보다 장점이 있습니까?


첫 번째 테스트에서 Python은 객체가 bool아직 값이 아닌 경우 값으로 변환 하려고 합니다 . 어느 정도, 우리는 목표를 묻습니다 : 당신은 의미가 있습니까? 이 다음 알고리즘을 사용하여 수행합니다.

  1. 에 object- __nonzero__특수한 메소드 가있는 경우 ( 숫자 내장 intfloat)이 메소드를 호출합니다. bool직접 사용되는 int또는 False0과 같은 경우 고려 되는 값을 리턴해야합니다 .

  2. 객체가있는 경우 그렇지 않은 경우, __len__특별한 방법을 (같은 컨테이너에 내장 된 기능을 수행 list, dict, set, tuple, 그것은 용기를 고려,이 메소드를 호출, ...) False가 (길이가 제로) 비어있는 경우.

  3. 않으면 객체 - 오는가 고려가 True되지 않는 한 객체 - 고려가 None됩니다 False.

두 번째 테스트에서는 동등성이 비교 None됩니다. 여기서 우리는 "당신은이 다른 가치와 같은가?" 이 다음 알고리즘을 사용하여 수행합니다.

  1. 객체에 __eq__메소드 가있는 경우이 메소드가 호출되고 리턴 값이 값이 변환되어 bool의 결과를 판별하는 데 사용 if됩니다.

  2. 당신이 원하는 곳에 __cmp__메소드가 호출됩니다. 이 함수는 int두 가지 순서를 배열합니다 ( -1if self < other, 0if self == other, +1if self > other)를 반환해야합니다 .

  3. 즉, 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, NotImplementedEllipsis. NotImplemented또는 을 사용하지 않을 가능성이 높고 (단순히 훨씬 더 명확 하기 때문에) Ellipsis절대로 말하지 않을 if x is True것이므로 .if xNone


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())(나에게 너무 모호하다).

참고 URL : https://stackoverflow.com/questions/100732/why-is-if-not-someobj-better-than-if-someobj-none-in-python

반응형