source

왜 '없음'을 선택합니까?__eq__("a")'가 참으로 평가되는 것 같습니까(그러나 완전히는 아닙니다)?

ittop 2023. 5. 22. 21:40
반응형

왜 '없음'을 선택합니까?__eq__("a")'가 참으로 평가되는 것 같습니까(그러나 완전히는 아닙니다)?

3문장을 하면 (내 Python 3.7을 b:

if None.__eq__("a"):
    print("b")

하만지,None.__eq__("a")으로 됩니다.NotImplemented.

히당연."a".__eq__("a")으로 됩니다.True,그리고."b".__eq__("a")으로 됩니다.False.

할 때 했지만 두 가 반환했습니다. 그래서 함수가 반환되었습니다.None.

이게 무슨 일입니까?

이것은 왜 그 이유에 대한 훌륭한 예입니다.__dunder__연산자를 하지 않은 는 안 . 당신은 다음과 같이 사용해야 합니다.== 비교를 하거나, 이 에는 operator를 하여 operator를 하여 operator for equality comparation, operator for equality comparation을 확인합니다.None,사용하다is(자세한 내용을 보려면 답변 하단에 표시).

당신은 했습니다.

None.__eq__('a')
# NotImplemented

은 환되는항목을 합니다.NotImplemented비교하는 유형이 다르기 때문입니다.이렇게 두 또 . 를 들어, 다과 같 다 은 유 방 비 보 생 예 십 다 시 오 해 각 를 른 음 는 교 하 이 식 러 한 로 으 개 를 체 두 른 형 의 ▁with ▁consider ▁where ▁objects ▁as 보 십 다 시 ▁are 오 ▁in ▁example ▁types ▁such음 ▁another , ▁being1그리고.'a'하고 요.하고있다(1).__eq__('a') 를 합니다.NotImplemented두은 이두값동에대성비해는교올하같다다방습니음과법은바른일을▁be▁the입니다.

1 == 'a'
# False

여기서 일어나는 일은

  1. 첫째번.(1).__eq__('a') 이 시하반환니다됩면도를 합니다.NotImplemented이는 작업이 지원되지 않음을 나타냅니다.
  2. 'a'.__eq__(1)를 하며, 이 한 이호되며동, 또한일값반환니를 합니다.NotImplemented.그렇게,
  3. 은 마치 않은 되고, 는동않것취처급며되럼은지물체일하▁the,▁are물,False반환됩니다.

다음은 몇 가지 사용자 지정 클래스를 사용하여 이러한 상황이 어떻게 발생하는지 보여주는 멋진 소형 MCVE입니다.

class A:
    def __eq__(self, other):
        print('A.__eq__')
        return NotImplemented

class B:
    def __eq__(self, other):
        print('B.__eq__')
        return NotImplemented

class C:
    def __eq__(self, other):
        print('C.__eq__')
        return True

a = A()
b = B()
c = C()

print(a == b)
# A.__eq__
# B.__eq__
# False

print(a == c)
# A.__eq__
# C.__eq__
# True

print(c == a)
# C.__eq__
# True

물론 그렇다고 해서 작업이 사실로 돌아오는 것은 아닙니다.그 이유는NotImplemented값입니다.

bool(None.__eq__("a"))
# True

마찬가지로,

bool(NotImplemented)
# True

참 및 거짓으로 간주되는 값에 대한 자세한 내용은 이 답변뿐만 아니라 진실테스트의 문서 섹션을 참조하십시오.여기서 주목할 필요가 있습니다.NotImplemented사실이지만, 클래스가 정의했다면 다른 이야기였을 것입니다.__bool__또는__len__False또는0각각 다음과 같다.


당신이 로동으것경의 등가물을 ,==연산자, 사용:

import operator
operator.eq(1, 'a')
# False

그러나 앞에서 언급한 바와 같이, 이 특정 시나리오에 대해, 당신이 확인하는 것은None,사용하다is:

var = 'a'
var is None
# False

var2 = None
var2 is None
# True

이와 동등한 기능은 다음을 사용합니다.

operator.is_(var2, None)
# True

None는 특수 개체이며 메모리에 한 가지 버전만 존재합니다.IOW, 그것은 유일한 싱글톤입니다.NoneType클래스(단, 동일한 개체에 여러 개의 참조가 있을 수 있음).PEP8 지침은 다음과 같이 명시합니다.

같은 싱글톤과의 비교None항상 다음을 수행해야 합니다.is또는is not절대 동일 연산자가 아닙니다.

요약하자면, 싱글톤에 대해서는None와의 신원 조회.is 다 더 .==그리고.is잘 될 겁니다.

당신이 보고 있는 결과는 그 사실 때문에 생긴 것입니다.

None.__eq__("a") # evaluates to NotImplemented

으로 됩니다.NotImplemented,그리고.NotImplemented의 진실 가치는 다음과 같이 문서화되어 있습니다.True:

https://docs.python.org/3/library/constants.html

메서드에서 해야 하는 특수 값( 이특메하예특는값수야반해환서에드서수진예▁which값(:수특▁(▁special)__eq__(),__lt__(),__add__(),__rsub__()유형에 되지 않음을 , 등)로될 수 있습니다. 인플레이스 이진 특수 방법(예: 인플레이스 이진 특수 방법)에 의해 반환될 수 있습니다.__imul__(),__iand__()등)을 동일한 목적으로 사용합니다.그것의 진실한 가치는 진실입니다.

이 걸면를화에 __eq()__ 사하는아수사용동로으라니이것용▁using▁manually▁를 사용하지 않고 수동으로 사용합니다.==이 돌아올 도 있다는 .NotImplemented그리고 그것의 진실한 가치가 진실이라는 것.

하셨듯이 이미짐셨이듯하작▁as.None.__eq__("a")으로 됩니다.NotImplemented하지만 만약 당신이 그런 것을 시도한다면.

if NotImplemented:
    print("Yes")
else:
    print("No")

결과는

네.

은 이은진실가의미다니합치를의 합니다.NotImplemented true

따라서 질문의 결과는 명백합니다.

None.__eq__(something) 확량수NotImplemented

그리고.bool(NotImplemented) 결과 로 평가됩니다.

그렇게if None.__eq__("a")입니다.

왜요?

다음을 반환합니다.NotImplemented 예: 예:

>>> None.__eq__('a')
NotImplemented
>>> 

하지만 이것을 보면,

>>> bool(NotImplemented)
True
>>> 

NotImplemented사실은 진실한 가치이기 때문에, 그것이 돌아오는 이유입니다.bTrue통과할 것이다, 무엇이든.False하지 않을.

어떻게 풀까요?

당신은 그것이 맞는지 확인해야 합니다.True그러니 좀 더 의심해 보세요.

>>> NotImplemented == True
False
>>> 

그러면 다음을 수행할 수 있습니다.

>>> if None.__eq__('a') == True:
    print('b')


>>> 

보시다시피, 아무것도 돌려주지 않습니다.

언급URL : https://stackoverflow.com/questions/53984116/why-does-if-none-eq-a-seem-to-evaluate-to-true-but-not-quite

반응형