Python 缩短条件链
我有一个很长的条件,可以检查字段是否已被修改以调用函数:Python 缩短条件链,python,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_
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)
这是为了在奥多10内使用
有没有办法缩短这种情况?谢谢请尝试改用布尔值有效值:
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
等等
如果需要的话,你甚至可以改变你的一些或条件(记住,“或”是关联的),比如:
等等
这意味着最终,您的条件将包括这些变量名,而不是整个条件,因此会短得多。尝试使用布尔有效值:
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
等等
如果需要的话,你甚至可以改变你的一些或条件(记住,“或”是关联的),比如:
等等
这意味着最终,您的条件将包括这些变量名,而不是整个条件,因此会短得多。请注意,这些条件总是正确的:
if self.half_pension or not self.half_pension \
or self.half_pension_occasional or not self.half_pension_occasional
布尔值要么为真,要么为假,因此上面的表达式是重言式:一个始终为真的条件。换句话说:问题中的if
语句不可能是假的
另外,请注意,self.half\u pension\u周三
的条件缺失,我不知道这是否是故意的
话虽如此,您似乎在比较一个对象中的所有字段,是否覆盖\uuuuueq\uuuuu
和\uuuu ne\uuuuu
使两个对象相等,当且仅当您感兴趣的所有字段都相同?相反,如果其中一个字段不同,它们就不同。这样,您的情况可以简单到:
if self != self._origin:
请注意,这些条件始终正确:
if self.half_pension or not self.half_pension \
or self.half_pension_occasional or not self.half_pension_occasional
布尔值要么为真,要么为假,因此上面的表达式是重言式:一个始终为真的条件。换句话说:问题中的if
语句不可能是假的
另外,请注意,self.half\u pension\u周三
的条件缺失,我不知道这是否是故意的
话虽如此,您似乎在比较一个对象中的所有字段,是否覆盖\uuuuueq\uuuuu
和\uuuu ne\uuuuu
使两个对象相等,当且仅当您感兴趣的所有字段都相同?相反,如果其中一个字段不同,它们就不同。这样,您的情况可以简单到:
if self != self._origin:
考虑到这一点:
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')]
或者类似的东西。您必须自己多走一英里,因为您没有提供详细信息,我们也没有关于self
内部内容的信息 考虑到这一点:
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')]
或者类似的东西。您必须自己多走一英里,因为您没有提供详细信息,我们也没有关于
self
内部内容的信息 尝试将其拆分为几个布尔变量,然后编写变量名而不是条件。是否有示例?谢谢你把它拆分成几个布尔变量,然后写下你的变量名而不是条件。你有一个例子吗?谢谢你,我和赛尔夫有个测试self.\u来源,但不起作用。我有一个错误:如果self.half_养老金和self!=self.\u origin:AttributeError:'ecole.partner.school'object没有属性'\u origin'首先,你必须覆盖\uuuuuuueq\uuu
和\uu ne\uuuuu
,这不像写self!=self.\u原点
。第二,确保你在正确的对象中,如果它抱怨找不到来源是因为你在一个不正确的地方。这应该让你开始:而且,如果没有一个。我无法重现您的错误,因此我无法帮助您。对不起,我有一个self测试self.\u来源,但不起作用。我有一个错误:如果self.half_养老金和self!=self.\u origin:AttributeError:'ecole.partner.school'object没有属性'\u origin'首先,你必须覆盖\uuuuuuueq\uuu
和\uu ne\uuuuu
,这不像写self!=self.\u原点
。第二,确保你在正确的对象中,如果它抱怨找不到来源是因为你在一个不正确的地方。这应该让你开始:而且,如果没有一个。我不能重现你的错误,所以我不能帮助你。