发布于2019-10-07 11:09 阅读(1312) 评论(0) 点赞(14) 收藏(5)
我正在使用python 2.7
考虑以下代码片段(该示例是人为设计的):
import datetime
class ScheduleData:
def __init__(self, date):
self.date = date
def __eq__(self, other):
try:
return self.date == other.date
except AttributeError as e:
return self.date == other
def __hash__(self):
return hash(self.date)
schedule_set = set()
schedule_set.add(ScheduleData(datetime.date(2010, 8, 7)))
schedule_set.add(ScheduleData(datetime.date(2010, 8, 8)))
schedule_set.add(ScheduleData(datetime.date(2010, 8, 9)))
print (datetime.date(2010, 8, 8) in schedule_set)
schedule_list = list(schedule_set)
print (datetime.date(2010, 8, 8) in schedule_list)
的输出是意外的(至少对我而言):
[08:02 PM toolscripts]$ python test.py
True
False
在第一种情况下,schedule_set
因为我已覆盖__hash__
和__eq__
函数,所以在中找到了给定的日期。
根据我的理解,in
运算符将检查集的哈希和相等性,但对于列表,它将仅对列表中的项目进行迭代并检查相等性。
那么这是怎么回事?为什么in
列表中的第二项测试schedule_list
失败?
我是否必须重写列表的其他功能?
问题在于比较调用的__eq__
功能与您要查找的功能相反。__eq__
当您有一个,ScheduleData() == datetime.date()
但in
运算符以相反的顺序执行比较时,定义的方法起作用,datetime.date() == ScheduleData()
这不会调用您的define __eq__
。只有充当左侧的类会__eq__
被调用。
此问题在python 2中发生的原因,而不是datetime.date.__eq__
在std库中的定义与3 有关。以以下两个类为例:
class A(object):
def __eq__(self, other):
print ('A.__eq__')
return False
class B(object):
def __eq__(self, other):
print ('B.__eq__')
items = [A()]
B() in items
B.__eq__
在Python 2和Python 3上均可运行此代码。该B
对象用作lhs,就像您的datetime.date
对象在Python 2中使用一样。但是,如果我重新定义B.__eq__
类似于Python 3的定义datetime.date.__eq__
:
class B(object):
def __eq__(self, other):
print ('First B.__eq__')
if isinstance(self, other.__class__):
print ('B.__eq__')
return NotImplemented
然后:
First B.__eq__
A.__eq__
在Python 2和3下都打印。返回的NotImplemented
原因导致检查的参数相反。
timetuple
正如@TimPeters所说(在我所不知道的有趣的怪癖中),在您的课程中使用将解决此问题,尽管似乎它不一定是一个函数
class ScheduleData:
timetuple = None
除了您已经拥有的之外,您还需要什么。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/132166/8d636736f6c45e424523/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!