Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 在Python中创建一个可以与变量属性进行比较和散列的对象_Class_Oop_Python 3.x_Text Processing - Fatal编程技术网

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很抱歉,我实际上想要两种行为,但我刚才添加的是我需要帮助的更难的行为。关于我将帖子更改为匹配的行为,您是对的,岁月是一个特例,当我把它复制过来时,我忘记了,很抱歉,它不够清晰。