2017-12-12 7 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返します。
  • ifおよびnotステートメントでは、結果も期待されます。
  • オペレータis==!=と一緒に使用した場合、結果は期待できません。

何が起こっているのですか?レコードセットは、ifnotステートメントでのみブール値として扱われますか?残りの演算子はオーバーロードされていませんか?

答えて

2

それは__nonzero__が実装されている方法です。真理値テストや組み込みの操作ブール値を(実現するために呼び出され

)。このメソッドが定義されていない場合はlen()が呼び出され、結果が0以外の場合はtrueとみなされます。クラスがlen()でもでもなく、0以外の()を定義していない場合、そのすべてのインスタンスは真とみなされます。あなたはodoo/odoo/models.py上でそれを確認することができます

Odoo 10のコードは次のとおりです。すべてを説明ルーカスの答えに加えて

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

。 Pythonでメソッドに変換されているすべての操作が

 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) 

すべての事業者が一致している方法。

これは、演算子を変更したときの結果が違う理由です。なぜなら、pythonはフードの下で別のメソッドを呼び出すからです。

関連する問題