Hm... with only a little bit of cooperation of the container class (e.g. xylophone), you could implement this yourself:
class xylophone: def __contains__(self, item): if hasattr(item, '__lcontains__'): return item.__lcontains__(self) return False On Tue, Nov 12, 2019 at 5:04 PM Samuel Muldoon <muldoonsam...@gmail.com> wrote: > *Currently, the `in` operator (also known as `__contains__`) always uses > the rightmost argument's implementation.* > > *For example,* > > >> * status = obj in "xylophone" * >> > > *Is similar to:* > > * status = "xylophone".__contains__( obj )* > > > *The current implementation of `__contains__` is similar to the way that > `+` used to only look to the leftmost argument for implementation. * > > * total = 4 + obj* >> >> * total = int.__add__(4, obj)* >> > > *However, these days, `__radd__` gives us the following:* > > * try:* >> * total = type(4).__add__(4, obj)* >> * except NotImplementedError:* >> >> * total = type(obj).__radd__(obj, 4) * >> > > *We propose something similar for `__contains__`: That a new dunder/magic > method `__lcontains__` be created and that the `in` operator be implemented > similarly to the following:* > > * # IMPLEMENTATION OF* >> >> * # status = obj in "xylophone"`* >> * try:* >> * status = "xylophone".__contains__(obj)* >> * except NotImplementedError:* >> >> * status = False * >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> * if not status: try: status = >> obj.__lcontains__(“xylophone”) except AttributeError: # type(obj) >> does not have an `__lcontains__` method with io.StringIO() as >> string_stream: print( "unsupported operand >> type(s) for `in`:", repr(type(4).__name__), >> "and", repr(type(obj).__name__), >> file=string_stream ) msg = string_stream.getvalue() >> raise TypeError(msg) from None* >> > > > > *The proposed enhancement would be backwards compatible except in the > event that a user already wrote a class having an `__lcontains__` method.* > > * With our running example of the string “xylophone”, writers of > user-defined classes would be able to decide whether their objects are > elements of “xylophone” or not. Programmer would do this by writing an > `__lcontains__` method.* > > *As an example application, one might develope a tree in which each node > represents a string (the strings being unique within the tree). A property > of the tree might be that node `n` is a descendant of node `m` if and only > if `n` is a sub-string of `m`. For example the string "yell" is a > descendant of "yellow." We might want the root node of the tree to be a > special object, `root` such that every string is in `root` and that `root` > is in no string. That is, the code `root in "yellow"` should return > `False`. If ` __lcontains__ ` were implemented, then we could implement the > node as follows:* > >> >> >> *class RootNode(Node): * >> >> * def __contains__(container, element):* >> >> >> * return True * >> >> * def __lcontains__(element, container):* >> >> * return False* >> > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/X2VCWCBJZABPWJH5LNMYPODZKNM7UZML/ > Code of Conduct: http://python.org/psf/codeofconduct/ > -- --Guido van Rossum (python.org/~guido) *Pronouns: he/him **(why is my pronoun here?)* <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/27AFGAUBCVK4B43XXFKLT2EA4WRBN52E/ Code of Conduct: http://python.org/psf/codeofconduct/