왜 '없음'을 선택합니까?__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).__eq__('a')
이 시하반환니다됩면도를 합니다.NotImplemented
이는 작업이 지원되지 않음을 나타냅니다. 'a'.__eq__(1)
를 하며, 이 한 이호되며동, 또한일값반환니를 합니다.NotImplemented
.그렇게,- 은 마치 않은 되고, 는동않것취처급며되럼은지물체일하▁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
사실은 진실한 가치이기 때문에, 그것이 돌아오는 이유입니다.b
True
통과할 것이다, 무엇이든.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
'source' 카테고리의 다른 글
Reactjs에서 Excel 파일을 읽는 중 (0) | 2023.05.22 |
---|---|
Git이 "블록체인"으로 간주되지 않는 이유는 무엇입니까? (0) | 2023.05.22 |
WPF: 창이 포커스를 잃었을 때 탐지 (0) | 2023.05.22 |
구성 요소에 URI로 식별되는 리소스가 없습니다. (0) | 2023.05.22 |
결과를 제한하기 전에 Mongo에게 컬렉션을 정렬하라고 어떻게 말합니까? (0) | 2023.05.22 |