为什么有些运营商在Odoo中的记录集没有按预期工作?

时间:2017-12-12 17:29:01

标签: python-2.7 operator-overloading odoo-8 odoo recordset

我做了一些测试:

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

发生了什么事?仅使用ifnot语句将记录集视为布尔值吗?其余的运营商是否没有超载?

2 个答案:

答案 0 :(得分: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在引擎盖下调用了另一种方法。

答案 1 :(得分:2)

__nonzero__的实施方式:

  

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

您可以在odoo/odoo/models.py上查看:

对于Odoo 10,代码为:

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