有没有办法让[X(),Y(),Z()]中的"X()"返回True?

Ken*_*ton 2 python contains operators

我在这个项目中有一个自定义对象,叫做Page.页面的标识功能是其标题.页是通常通过调用创建Wiki.page,Wiki.categoryWiki.template,或通过从其它的方法,如生成它们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
Run Code Online (Sandbox Code Playgroud)

应该是True,而不是False,因为其中一个带有title"title" 的页面.有没有一种神奇的方法可以用来制作真的?我已经尝试过使用__eq__(for equality)和__hash__(for hash checking)(commit),但似乎都没有.列表只是使用身份吗?或者还有其他我想念的东西?我该怎么做呢?

Att*_*tie 5

我原来的答案是错误的兔子洞......(见历史).

总是值得推行什么突破的简化版本...见下文(使用这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 ])
Run Code Online (Sandbox Code Playgroud)

输出:

<__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
Run Code Online (Sandbox Code Playgroud)

如你所见,这有效......

我不确定你对你的使用感觉如何self.__dict__.update(data)...它第一次让我措手不及......而且我现在怀疑它在这里这里的使用(两条线都做同样的事......)

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
Run Code Online (Sandbox Code Playgroud)

你能确保这些电话不会覆盖title吗?