是否有方法使[X()、Y()、Z()]中的“X()返回True?”?

2024-05-19 00:21:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在this project of mine中有一个自定义对象,称为Page。页面的识别特征是它的title。页面通常是通过调用^{}^{}^{}创建的,或者通过从其他方法(如^{})生成它们来创建的。(我建议您在继续之前先看一下这是什么。)

有时,此模块的用户可能希望生成一些页面并将该生成器转换为普通的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

应该是正确的,而不是错误的,因为有一个页面中有title“标题”。有什么神奇的方法可以让我实现这一点吗?我已经试过使用__eq__(表示相等)和__hash__(表示散列检查)(commit),但两种方法似乎都不管用。列表仅仅使用标识吗?或者我还缺什么?我该怎么做?你知道吗


Tags: of对象方法projectapi列表titlepage
2条回答

等等,现在可以了!你知道吗

>>> 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

好吧,我不知道以前出了什么问题。这个问题现在解决了。不过,我会记住Attieanswer。你知道吗

我最初的答案是错误的。。。(见历史)。你知道吗

它总是值得实现一个简化的版本来打破。。。见下文(使用这些1234作为灵感)

#!/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)的感觉如何。。。第一次就让我措手不及。。。我现在怀疑它是否使用herehere(两行都做相同的事情……)

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吗?你知道吗

相关问题 更多 >

    热门问题