我的条件很长,可以检查是否已修改字段以调用函数:
if self.half_pension or not self.half_pension or self.half_pension_occasional \
or not self.half_pension_occasional or self.half_pension_id != self._origin.half_pension_id \
or self.half_pension_begin_date != self._origin.half_pension_begin_date \
or self.half_pension_end_date != self._origin.half_pension_end_date \
or self.half_pension_monday != self._origin.half_pension_monday \
or self.half_pension_tuesday != self._origin.half_pension_tuesday \
or self.half_pension_thursday != self._origin.half_pension_thursday \
or self.half_pension_friday != self._origin.half_pension_friday \
or self.half_pension_responsible_partner != self._origin.half_pension_responsible_partner:
monstringxmlhalfpension = self.get_data_xml_for_halfpension(idUsager)
resp_halfpension = c.service.XmlAjouterUnEvenement(Synchrone=1, donneesXml=monstringxmlhalfpension)
这应在Odoo 10中使用。
是否可以缩短这种情况?谢谢
答案 0 :(得分:1)
请注意,这些条件始终为真:
if self.half_pension or not self.half_pension \
or self.half_pension_occasional or not self.half_pension_occasional
布尔值是true还是false,因此上面的表达式是一个重言式:一个始终为true的条件。换句话说,问题中的if
语句不可能为假。
此外,请注意,缺少self.half_pension_wednesday
的条件,我不知道这是否是故意的。
已经说过-您似乎正在比较对象中的所有字段,那么如何覆盖__eq__
和__ne__
以便当且仅当您感兴趣的所有字段都相等时两个对象相等在相同吗?相反,如果其中一个字段不同,则它们是不同的。这样,您的情况就可以很简单了:
if self != self._origin:
答案 1 :(得分:1)
考虑这一点:
self.SOMETHING1 != self._origin.SOMETHING1
or self.SOMETHING2 != self._origin.SOMETHING2
or self.SOMETHING3 != self._origin.SOMETHING3
可以使用getattr
来缩短它:
attrs = ['SOMETHING1', 'SOMETHING2', 'SOMETHING3']
any(getattr(self, attr) != getattr(self._origin, attr) for attr in attrs)
当然,您也可以动态创建attrs
,例如通过使用:
attrs = [attr for attr in dir(self) if attr.startswith('half_pension')]
或类似的内容。由于您没有提供MVCE,因此您必须自己多走一步,而且我们也没有self
内部的信息。
答案 2 :(得分:0)
尝试改用布尔变量:
begin_date_error = self.half_pension_begin_date != self._origin.half_pension_begin_date
mond_error = self.half_pension_monday != self._origin.half_pension_monday
等
如果需要,您甚至可以汇总您的一些或条件(提示,“或”是关联的),例如:
week_error = mond_error or tue_error or wed_error or thu_error or fri_error
等
这意味着最后,您的条件将包括这些变量名而不是整个条件,因此要短得多。