我做了一些测试:
>>> 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()
一起投射时,它会返回True
或False
。 if
和not
语句,结果也是预期的结果。is
,==
,!=
一起使用时,结果不是预期的。发生了什么事?仅使用if
和not
语句将记录集视为布尔值吗?其余的运营商是否没有超载?
答案 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))