2016-12-05 11 views

답변

16

in__contains__이고 is은 dunder 메소드가 없습니다. 난 강력하게 당신이 operator module의 기능을 사용하는 것이 좋습니다 : __contains____iter____getitem__되는 정의되지 않은 경우

a < b => operator.lt(a, b) 
a == b => operator.eq(a, b) 
a in b => operator.contains(a, b) 
a is b => operator.is_(a, b) 
+0

왜 '연산자'모듈이 일반적인 방식보다 더 좋을까요? –

+0

연산자의 함수 버전이 필요한 경우 연산자 모듈이 dunder 메서드에 액세스하거나 자체 래퍼를 작성하는 것보다 낫습니다. –

+3

'getattr (a, '__lt __') (b)'함수 버전을 찾고있는'a

26

in의 경우 정확한 dunder 메서드는 __contains__입니다.

is에 대한 방법은 id(a) == id(b)과 같기 때문에이 방법이 없습니다. 이것은 파이썬에 의해 두포에서 사용 된 실제 객체 ID를 비교하므로 객체 내용이 아닌 객체 ID를 비교하는 데 사용됩니다. 클래스 내에서 그것을 덮어 쓰면 파이썬의 객체 모델이 깨질 수 있으므로 허용되지 않습니다.

1

__contains__ 가을 백 옵션, in에 대한 올바른 것입니다.

getattr을 사용해야하는 이유는 무엇입니까? is에 대해 "정의"되어 있습니다. 모든 객체가 파이썬에 있습니다. operator._is 또는 (시도 및 실패) getattr을 거칠 필요가 없습니다.

See the documentation on built-in types :

을 사용자 정의 할 수없는 isis not 사업자의 동작; 은 두 개의 객체에 적용될 수 있으며 예외를 발생시키지 않습니다.

(강조 광산)

단지 기능을 잡고 getattr(a, "function")(b)를 사용하여 전화 사용자가 제공 한 조각에 따르면, 당신은 이미 당신이 평가하는 데 필요한 개체의 이름이 바로 is를 사용 바로; 항상 사용할 수 있습니다.