Class 在Python中创建一个可以与变量属性进行比较和散列的对象
我正在编写一个关于引用的软件包,其中大部分都是这种形式的Class 在Python中创建一个可以与变量属性进行比较和散列的对象,class,oop,python-3.x,text-processing,Class,Oop,Python 3.x,Text Processing,我正在编写一个关于引用的软件包,其中大部分都是这种形式的 Author, Year, Journal, Volume, Page, DOI 因此,一个字符串包含一系列用逗号分隔的字段。不幸的是,一些(~5%)字段缺少其中一个(或通常不止一个) 为了使用它们做有用的事情,我需要能够检查两个字段是否相同,如果缺少字段,则忽略该字段。我定义了一个\uuuuuuuuuueq(self,other),它通过一系列if语句来实现这一点,如下所示: elif hasattr(self, 'V') and h
Author, Year, Journal, Volume, Page, DOI
因此,一个字符串包含一系列用逗号分隔的字段。不幸的是,一些(~5%)字段缺少其中一个(或通常不止一个)
为了使用它们做有用的事情,我需要能够检查两个字段是否相同,如果缺少字段,则忽略该字段。我定义了一个\uuuuuuuuuueq(self,other)
,它通过一系列if语句来实现这一点,如下所示:
elif hasattr(self, 'V') and hasattr(other, 'V') and getattr(self, 'V') != getattr(other, 'V'):
return False
not (hasattr(self, "year") and (hasattr(other, "year")) or self.year == other.year
关于引文的一个常量是作者在场,并且至少有一个年份或期刊也在场
我觉得应该有一个更快的方法来做这件事,但一直没能想出一个。有没有一种更快的方法来实现这一点,因为这确实有助于处理?而不是使用长
if
/elif
链,并显式返回Fase
如果条件发现不匹配,则可以使用和
直接在布尔表达式中将比较链接在一起:
return (self.author == other.author and
self.year == other.year and
self.journal == other.journal
...)
如果需要,您可以继续使用getattr
调用,但我建议将逻辑移到初始化代码中,以填充None
中缺少的值,而不需要在检查属性的任何地方重复它。这样,您将始终拥有您期望的属性,那些没有有意义数据的属性将仅以None
作为其值
请注意,getattr
代码的当前行为与您对所需行为的描述不太匹配(“检查两者是否相同,如果缺少字段则忽略该字段”)。如果一个属性出现在一个引用中而不出现在另一个引用中,则当前代码将返回False
,即使其余值匹配。如果希望行为与您的描述相匹配,请使用以下内容:
elif hasattr(self, 'V') and hasattr(other, 'V') and getattr(self, 'V') != getattr(other, 'V'):
return False
not (hasattr(self, "year") and (hasattr(other, "year")) or self.year == other.year
或者(如果没有指定年份,则在\uuuu init\uuuuu
中执行year=None
):
您是否希望将仅在一个字段中存在差异,但在另一个字段中缺失的引用进行同等比较?例如,
作者,年份,页码
与作者,年份
?如果是这样的话,您当前的代码将无法做到这一点(如果两个引用都有或没有每个属性,它只会比较两个引用相等)。@Blckknght很抱歉,我实际上想要两种行为,但我刚才添加的是我需要帮助的更难的行为。关于我将帖子更改为匹配的行为,您是对的,岁月是一个特例,当我把它复制过来时,我忘记了,很抱歉,它不够清晰。