¿Hay alguna manera de hacer que “X () en ” se vuelva verdadero?

Tengo un objeto personalizado en este proyecto mío , llamado Page. La característica de identificación de una página es su título . Una página se crea normalmente llamando a Wiki.page , Wiki.category o Wiki.template , o generándolas a partir de otros métodos como Wiki.random . (Te recomiendo que mires un poco lo que es antes de continuar).

A veces, los usuarios de este módulo pueden querer generar algunas Páginas y convertir ese generador en una list normal. Después de obtener esa lista de Páginas, es posible que deseen verificar si hay otra página que obtuvieron en esa lista. Sin embargo, esto:

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

debe ser Verdadero, no Falso, porque hay una página con el title “título” en él. ¿Hay algún método mágico que pueda usar para hacer eso verdadero? Ya intenté usar __eq__ (para la igualdad) y __hash__ (para la comprobación de hash) ( cometer ), pero ninguno de los dos parecía hacer el truco. ¿Las listas simplemente usan identidad? ¿O hay algo más que me falta? ¿Cómo hago esto correctamente?

Mi respuesta original fue por el agujero de conejo equivocado … (ver la historia).

Siempre vale la pena implementar una versión simplificada de lo que se está rompiendo … vea a continuación (usando estos 1 , 2 , 3 , 4 como inspiración)

 #!/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 ]) 

Salida:

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

Como puedes ver, esto funciona …

No estoy seguro de cómo me siento acerca de tu uso de self.__dict__.update(data) … me sorprendió la primera vez … y desconfío de su uso aquí y aquí (ambas líneas sí la misma cosa…)

 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 

¿Puede asegurarse de que estas llamadas no anulen el title ?

Espera, ahora funciona!

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

Está bien, no sé qué salió mal antes. Esto está resuelto ahora. Aunque tendré en mente la respuesta de Attie .