为什么有些操作员在Odoo中的记录集无法按预期工作?

Che*_*uCR 5 operator-overloading recordset python-2.7 odoo odoo-8

我已经做了一些测试:

>>> 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
Run Code Online (Sandbox Code Playgroud)
  • 当记录集与其一起转换时bool(),返回TrueFalse
  • 使用ifnot语句,结果也是预期的。
  • 但是,当它与运营商使用is==!=是不是预期的结果。

怎么了?仅通过ifand not语句将记录集视为布尔值吗?其余的操作员是否不超负荷?

小智 3

__nonzero__其实现方式是这样的:

调用以实现真值测试和内置操作bool();应该返回 False 或 True,或者它们的整数等效值 0 或 1。如果未定义此方法,则调用len ()(如果已定义),并且如果其结果非零,则该对象被视为 true。如果一个类既没有定义len () 也没有定义nonzero (),则它的所有实例都被认为是 true。

你可以在odoo/odoo/models.py上检查:

对于 Odoo 10,代码是:

def __nonzero__(self):
    """ Test whether ``self`` is nonempty. """
    return bool(getattr(self, '_ids', True))
Run Code Online (Sandbox Code Playgroud)