有没有办法让 "X() in [X(), Y(), Z()]" return 为真?
Is there a way to make "X() in [X(), Y(), Z()]" return True?
我在 this project of mine, called Page. A Page's identifying feature is its title. A Page is normally created by calling Wiki.page
, Wiki.category
, or Wiki.template
, or by generating them from other methods like Wiki.random
中有一个自定义对象。 (我建议您在继续之前先看一下那是什么。)
有时,此模块的用户可能希望生成一些页面并将该生成器转换为普通 list
。在他们获得该页面列表后,他们可能想要检查他们获得的另一个页面是否在该列表中 。然而,这:
>>> wp = mw_api_client.Wiki('https://en.wikipedia.org/w/api.php')
>>> wp.page('title') in [wp.page('title'),
wp.page('not this'),
wp.page('not this either')]
False
应该是 True,而不是 False,因为 是 一个包含 title
"title" 的页面。有什么神奇的方法可以让我做到这一点吗?我已经尝试使用 __eq__
(为了相等)和 __hash__
(为了哈希检查)(commit),但似乎都没有成功。列表只使用标识吗?还是我还缺少其他东西?我该如何正确执行此操作?
我原来的答案掉进了错误的兔子洞...(查看历史记录)。
总是 值得实施一个简化版本的破坏...见下文(使用这些 1,2,3,4 作为灵感)
#!/usr/bin/env python3
from pprint import pprint
class Page(object):
def __init__(self, wiki, **data):
self.wiki = wiki
self.title = None
self.__dict__.update(data)
def __eq__(self, other):
return self.title == other.title
class Wiki(object):
def __init__(self, api_url):
self.api_url = api_url
def page(self, title, **evil):
if isinstance(title, Page):
return title;
return Page(self, title=title, **evil)
w = Wiki('url')
pprint(w)
pprint(w.__dict__)
p1 = w.page('testing')
pprint(p1)
pprint(p1.__dict__)
p2 = w.page('testing')
pprint(p2)
pprint(p2.__dict__)
p3 = w.page('testing something else')
pprint(p3)
pprint(p3.__dict__)
pprint(p1 == p2)
pprint(p1 == p3)
pprint(p1 in [ p2 ])
pprint(p1 in [ p2, p3 ])
输出:
<__main__.Wiki object at 0x7f2891957d30>
{'api_url': 'url'}
<__main__.Page object at 0x7f2891957dd8>
{'title': 'testing', 'wiki': <__main__.Wiki object at 0x7f2891957d30>}
<__main__.Page object at 0x7f2891957e48>
{'title': 'testing', 'wiki': <__main__.Wiki object at 0x7f2891957d30>}
<__main__.Page object at 0x7f289190cf60>
{'title': 'testing something else',
'wiki': <__main__.Wiki object at 0x7f2891957d30>}
True
False
True
True
如您所见,这有效...
我不确定我对你使用 self.__dict__.update(data)
的感觉...它第一次让我措手不及...我目前怀疑它的使用 here and here (两条线做同样的事情...)
class Page(object):
def __init__(self, wiki, getinfo=None, **data):
# ...
if getinfo is None:
getinfo = GETINFO
if getinfo:
self.__dict__.update(self.info())
def info(self):
# ...
self.__dict__.update(page_data)
return page_data
您能否确保这些调用不会覆盖 title
?
等等,现在可以了!
>>> w = mw.Wiki('https://en.wikipedia.org/w/api.php')
>>> a = [w.page('hi'), w.page('ih'), w.page('ij')]
>>> w.page('hi') in a
True
好吧,之前不知道哪里出了问题。现在已经解决了。不过,我会记住 Attie's 。
我在 this project of mine, called Page. A Page's identifying feature is its title. A Page is normally created by calling Wiki.page
, Wiki.category
, or Wiki.template
, or by generating them from other methods like Wiki.random
中有一个自定义对象。 (我建议您在继续之前先看一下那是什么。)
有时,此模块的用户可能希望生成一些页面并将该生成器转换为普通 list
。在他们获得该页面列表后,他们可能想要检查他们获得的另一个页面是否在该列表中 。然而,这:
>>> wp = mw_api_client.Wiki('https://en.wikipedia.org/w/api.php')
>>> wp.page('title') in [wp.page('title'),
wp.page('not this'),
wp.page('not this either')]
False
应该是 True,而不是 False,因为 是 一个包含 title
"title" 的页面。有什么神奇的方法可以让我做到这一点吗?我已经尝试使用 __eq__
(为了相等)和 __hash__
(为了哈希检查)(commit),但似乎都没有成功。列表只使用标识吗?还是我还缺少其他东西?我该如何正确执行此操作?
我原来的答案掉进了错误的兔子洞...(查看历史记录)。
总是 值得实施一个简化版本的破坏...见下文(使用这些 1,2,3,4 作为灵感)
#!/usr/bin/env python3
from pprint import pprint
class Page(object):
def __init__(self, wiki, **data):
self.wiki = wiki
self.title = None
self.__dict__.update(data)
def __eq__(self, other):
return self.title == other.title
class Wiki(object):
def __init__(self, api_url):
self.api_url = api_url
def page(self, title, **evil):
if isinstance(title, Page):
return title;
return Page(self, title=title, **evil)
w = Wiki('url')
pprint(w)
pprint(w.__dict__)
p1 = w.page('testing')
pprint(p1)
pprint(p1.__dict__)
p2 = w.page('testing')
pprint(p2)
pprint(p2.__dict__)
p3 = w.page('testing something else')
pprint(p3)
pprint(p3.__dict__)
pprint(p1 == p2)
pprint(p1 == p3)
pprint(p1 in [ p2 ])
pprint(p1 in [ p2, p3 ])
输出:
<__main__.Wiki object at 0x7f2891957d30>
{'api_url': 'url'}
<__main__.Page object at 0x7f2891957dd8>
{'title': 'testing', 'wiki': <__main__.Wiki object at 0x7f2891957d30>}
<__main__.Page object at 0x7f2891957e48>
{'title': 'testing', 'wiki': <__main__.Wiki object at 0x7f2891957d30>}
<__main__.Page object at 0x7f289190cf60>
{'title': 'testing something else',
'wiki': <__main__.Wiki object at 0x7f2891957d30>}
True
False
True
True
如您所见,这有效...
我不确定我对你使用 self.__dict__.update(data)
的感觉...它第一次让我措手不及...我目前怀疑它的使用 here and here (两条线做同样的事情...)
class Page(object):
def __init__(self, wiki, getinfo=None, **data):
# ...
if getinfo is None:
getinfo = GETINFO
if getinfo:
self.__dict__.update(self.info())
def info(self):
# ...
self.__dict__.update(page_data)
return page_data
您能否确保这些调用不会覆盖 title
?
等等,现在可以了!
>>> w = mw.Wiki('https://en.wikipedia.org/w/api.php')
>>> a = [w.page('hi'), w.page('ih'), w.page('ij')]
>>> w.page('hi') in a
True
好吧,之前不知道哪里出了问题。现在已经解决了。不过,我会记住 Attie's