缩短条件链

时间:2018-12-10 15:00:37

标签: python

我的条件很长,可以检查是否已修改字段以调用函数:

    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中使用。

是否可以缩短这种情况?谢谢

3 个答案:

答案 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

这意味着最后,您的条件将包括这些变量名而不是整个条件,因此要短得多。