- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 Python 新手,我想确保我正确地覆盖了 __eq__
和 __hash__
,以免以后造成痛苦的错误:
(我使用的是 Google App Engine。)
class Course(db.Model):
dept_code = db.StringProperty()
number = db.IntegerProperty()
title = db.StringProperty()
raw_pre_reqs = db.StringProperty(multiline=True)
original_description = db.StringProperty()
def getPreReqs(self):
return pickle.loads(str(self.raw_pre_reqs))
def __repr__(self):
title_msg = self.title if self.title else "Untitled"
return "%s %s: %s" % (self.dept_code, self.number, title_msg)
def __attrs(self):
return (self.dept_code, self.number, self.title, self.raw_pre_reqs, self.original_description)
def __eq__(self, other):
return isinstance(other, Course) and self.__attrs() == other.__attrs()
def __hash__(self):
return hash(self.__attrs())
稍微复杂一点的类型:
class DependencyArcTail(db.Model):
''' A list of courses that is a pre-req for something else '''
courses = db.ListProperty(db.Key)
''' a list of heads that reference this one '''
forwardLinks = db.ListProperty(db.Key)
def __repr__(self):
return "DepArcTail %d: courses='%s' forwardLinks='%s'" % (id(self), getReprOfKeys(self.courses), getIdOfKeys(self.forwardLinks))
def __eq__(self, other):
if not isinstance(other, DependencyArcTail):
return False
for this_course in self.courses:
if not (this_course in other.courses):
return False
for other_course in other.courses:
if not (other_course in self.courses):
return False
return True
def __hash__(self):
return hash((tuple(self.courses), tuple(self.forwardLinks)))
一切看起来都不错?
更新以反射(reflect) @Alex 的评论
class DependencyArcTail(db.Model):
''' A list of courses that is a pre-req for something else '''
courses = db.ListProperty(db.Key)
''' a list of heads that reference this one '''
forwardLinks = db.ListProperty(db.Key)
def __repr__(self):
return "DepArcTail %d: courses='%s' forwardLinks='%s'" % (id(self), getReprOfKeys(self.courses), getIdOfKeys(self.forwardLinks))
def __eq__(self, other):
return isinstance(other, DependencyArcTail) and set(self.courses) == set(other.courses) and set(self.forwardLinks) == set(other.forwardLinks)
def __hash__(self):
return hash((tuple(self.courses), tuple(self.forwardLinks)))
最佳答案
第一个很好。第二个问题有两个原因:
.courses
.courses
但不同 .forwardLinks
的两个实体会比较相等但具有不同的哈希值我将通过使相等性依赖于类(class)和前向链接来解决第二个问题,但是对集合的两个更改(因此没有重复),对于散列也是如此。即:
def __eq__(self, other):
if not isinstance(other, DependencyArcTail):
return False
return (set(self.courses) == set(other.courses) and
set(self.forwardLinks) == set(other.forwardLinks))
def __hash__(self):
return hash((frozenset(self.courses), frozenset(self.forwardLinks)))
这当然是假设前向链接对一个对象的“真实值(value)”至关重要,否则它们应该从 __eq__
和 __hash__
。
Edit:从 __hash__
调用中删除了对 tuple
的调用,这些调用充其量是多余的(并且可能具有破坏性,正如@Mark 的评论所建议的那样[[tx!!!]]);正如@Phillips [[tx!!!]] 的评论所建议的,将散列中的 set
更改为 frozenset
。
关于Python:这是覆盖 __eq__ 和 __hash__ 的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076967/
我有一个类,我想为这个类写一个__hash__()方法。我要编写的方法在某些情况下会返回对象的默认散列,而在其他一些情况下会返回其属性之一的散列。所以,作为一个简单的测试用例: class Foo:
我有一个类(class)叫 Transaction ,其中包含多个属性。如果这些属性中的任何一个匹配,那么我希望将这些事务视为重复事务,因此不想在集合中存储重复项。 class Transaction
假设我写了一个类,但没有为它定义一个__hash__。然后__hash__(self)默认为id(self)(self的内存地址),根据the documentation . 但是我没有在文档中看到这
我正在尝试为字符串创建自定义哈希函数。我想按权重按字符频率对字符串进行哈希处理。这样 hi 和 ih 将产生相同的散列。我可以覆盖 __hash__ 吗? 或者创建一个包含字符串并覆盖 __hash_
假设我有一些 Person 实体,我想知道其中一个是否在列表中: person in people? 我不关心“对象的 ID”是什么,只关心它们的属性是否相同。所以我把它放在我的基类中: # valu
在 Python 文档中,我们可以阅读有关 __hash__ 函数的内容: The only required property is that objects which compare equal
我在正确散列我的对象时遇到了问题。考虑以下代码: class Foo: def __init__(self, bar): self.keys = list(bar.keys()
有没有办法给js自定义哈希中的对象,就像重写一样 __hash__() 在 python 中,让我们定义如何将给定对象散列到字典中。 我的基本问题是:使用什么哈希函数将 js 对象放入关联数组中,我可
我刚刚在 Python3 中观察到 Set 的一个有趣行为,我想知道为什么。 给定类: class Tab: @staticmethod def set(size):
给定: class T: def __hash__(self): return 1234 t1 = T() t2 = T() my_set = { t1 } 我希望以下内容打印
编辑:正如@BrenBarn 指出的那样,原文没有意义。 给定一个字典列表(由 csv.DictReader 提供——它们都有 str 键和值)最好通过全部填充来删除重复项在一个集合中,但这不能直接完
我所做的显然不是人们想要做的事情,相反,我只是在测试为给定类实现 __hash__。 我想看看是否向字典添加一个虚假的“可散列”类,然后更改它的散列值会导致它无法访问它。 我的类(class)是这样的
这个问题在这里已经有了答案: add object into python's set collection and determine by object's attribute (1 个回答)
实现__hash__()的正确好方法是什么? 我说的是返回哈希码的函数,该哈希码随后用于将对象插入哈希表(也称为字典)中。 由于 __hash__() 返回一个整数并用于将对象“分箱”到哈希表中,我假
在 Python 中,我知道 __hash__ 为给定对象返回的值在该对象的生命周期内应该是相同的。但是,出于好奇,如果不是,会发生什么?这会造成什么样的破坏? class BadIdea(objec
我有一个名为 WeakBoundMethod 的类(codereview.se 上的 source)。我想要一些关于我应该如何实现的指南 __hash__() .此外,Python 3 自动提供了 _
我希望这可行(在 Python 3.6 中), class A: __hash__ = id A().__hash__() 但我明白了 TypeError: id() takes exactl
以下将起作用,但我宁愿不需要重复 __hash__在每个子类中。有没有办法告诉数据类继承哈希函数(即不将其设置为 None )? from dataclasses import dataclass @
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在尝试理解我目前正在处理的一段代码(它的 pacman)。 我在 Python 中有以下二维数组: self.data = [[initialValue for y in range(height
我是一名优秀的程序员,十分优秀!