在Python中创建一个可以与变量属性进行比较和散列的对象

时间:2015-09-08 23:35:24

标签: class oop python-3.x text-processing

我正在制作一个处理引文的软件包,其中大多数都是

形式
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

关于引文的一个常数是作者在场并且至少有一年或期刊也是如此。

我觉得应该有更快的方法来做到这一点,但却无法想出一个。有没有更快的方法来实现这一点,因为这真的有助于处理?

1 个答案:

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