有没有办法在[X(),Y(),Z()]和#34中制作" X();回归真的?

时间:2018-02-21 12:15:05

标签: python operators contains

我在this project of mine中有一个名为Page的自定义对象。网页的标识功能是title。通常通过调用Wiki.pageWiki.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

应该是True,而不是False,因为一个带有title" title"在里面。有没有一种神奇的方法可以用来制作真的?我已经尝试使用__eq__(用于相等)和__hash__(用于哈希检查)(commit),但似乎都没有使用。列表只是使用身份吗?或者还有其他我想念的东西?我该怎么做呢?

2 个答案:

答案 0 :(得分:5)

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

始终值得实施正在破坏的简化版本...见下文(使用这些123,{{3作为灵感)

192.168.1.10

输出:

#!/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 的使用感觉如何......第一次让我措手不及......我目前对它的使用感到怀疑4和{ {3}}(两条线都做同样的事情......)

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

答案 1 :(得分:0)

等等,现在可行了!

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