2017-12-12 16 views
4

나는 몇 가지 테스트를 수행 한 : 레코드가 bool()와 함께 캐스팅 된 경우일부 운영자가 Odoo의 레코드 세트에서 예상대로 작동하지 않는 이유는 무엇입니까?

>>> empty_recordset = self.env['res.users']         # empty recordset 
>>> not_empty_recordset = self.env['res.users'].search([('id', '=', 1)]) # recordset with one record 

>>> empty_recordset is False 
False 

>>> empty_recordset is None 
False 

>>> empty_recordset == False 
False 

>>> empty_recordset == True 
False 

>>> bool(empty_recordset) 
False 

>>> not empty_recordset 
True 

>>> if empty_recordset:   # it is treated as False 
...  print('hello') 
... 

>>> bool(not_empty_recordset) 
True 

>>> if not_empty_recordset: 
...  print('hello') 
... 
hello 

>>> not not_empty_recordset 
False 
  • True 또는 False 반환합니다.
  • ifnot 문을 사용하면 결과도 예상됩니다.
  • 그러나 연산자를 is, ==, !=과 함께 사용하면 결과가 예상되지 않습니다.

무슨 일입니까? 레코드 집합은 ifnot 문으로 만 부울 값으로 처리됩니까? 나머지 사업자들은 과부하 상태가 아닌가?

답변

2

그것은이 방법 __nonzero__이 구현되는 것 :

진리 값 테스트 및 내장 작업 부울()를 구현하기 위해 호출; 이 메서드가 정의되어 있지 않은 경우 len()이 정의되어 있으면이 메서드가 호출되고 그 결과가 0이 아닌 경우 true로 간주됩니다. 클래스가 len()도 (0 이외)()도 정의하지 않으면 모든 인스턴스가 true로 간주됩니다.

당신은 odoo/odoo/models.py에 그것을 확인할 수 있습니다

Odoo (10)에 대한 코드는 다음과 같습니다

def __nonzero__(self): 
    """ Test whether ``self`` is nonempty. """ 
    return bool(getattr(self, '_ids', True)) 
3

을 모두 설명 루카스의 대답에 추가. 파이썬의 방법으로 변환됩니다 모든 작업이

 if object: 
     # is turned to. 
     if object.__nonzero__(): 

그리고

 if object == value: 
     #is turned to 
     if object.__eq__(value): 

를 호출에도이 있습니다 :

 object + value 
     # is converted go this 
     object.__add__(value) 

모든 사업자가 일치 한 방법.

그래서 파이썬은 후드에서 다른 메소드를 호출하기 때문에 연산자를 변경했을 때 다른 결과를 얻었습니다.