我正在制作一个处理引文的软件包,其中大多数都是
形式Author, Year, Journal, Volume, Page, DOI
这是一个由逗号分隔的一系列字段的字符串。不幸的是,有些(~5%)缺少这些字段中的一个(或通常不止一个)。
要用它们做有用的事情,我需要能够检查两个是否相同,如果缺少一个字段。我有一个__eq__(self, other)
定义,用这样的一系列if语句执行此操作:
elif hasattr(self, 'V') and hasattr(other, 'V') and getattr(self, 'V') != getattr(other, 'V'):
return False
关于引文的一个常数是作者在场并且至少有一年或期刊也是如此。
我觉得应该有更快的方法来做到这一点,但却无法想出一个。有没有更快的方法来实现这一点,因为这真的有助于处理?
答案 0 :(得分:0)
如果条件发现不匹配,您可以直接将比较链接在一个布尔表达式中,而不是使用长if
/ elif
链并显式返回Fase
{{1 }}:
and
如果需要,您可以继续使用return (self.author == other.author and
self.year == other.year and
self.journal == other.journal
...)
来电,但我建议将逻辑移到getattr
以填写初始化代码中的缺失值,而不是需要在任何地方重复它检查属性。这样,您将始终拥有您期望的属性,没有有意义数据的属性只会以None
作为其值。
请注意,None
代码的当前行为与您提供的所需行为的描述不完全匹配(“如果缺少某个字段,则检查两个是否相同”)。如果属性存在于一个引文中而不存在于另一个引用中,则当前代码将返回getattr
,即使其余值匹配也是如此。如果您希望行为符合您的描述,请使用以下内容:
False
或者(如果在not (hasattr(self, "year") and (hasattr(other, "year")) or self.year == other.year
year = None
__init__
,如果没有指定年份,则为<{1}}:
None in (self.year, other.year) or self.year == other.year