__contains__ classmethod?
MRAB
python at mrabarnett.plus.com
Mon Dec 18 19:16:59 EST 2017
On 2017-12-18 21:25, Tim Chase wrote:
> Playing around, I had this (happens to be Py2, but gets the same
> result in Py3) code
>
> class X(object):
> ONE = "one"
> TWO = "two"
> _ALL = frozenset(v for k,v in locals().items() if k.isupper())
> @classmethod
> def __contains__(cls, v):
> return v in cls._ALL
> print(dir(X))
> print(X._ALL)
>
> Running this gives
>
> ['ONE', 'TWO', '_ALL', '__class__', '__contains__', '__delattr__',
> '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
> '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
> '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
> '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
> '__str__', '__subclasshook__', '__weakref__']
>
> And then, depending on whether it's Py2 or Py3, I get either
>
> frozenset({'one', 'two'})
> frozenset(['two', 'one'])
>
> Which I expect. Hey, look. There's a __contains__ method. And it
> has been specified as a @classmethod. So I want to test it:
>
> print("one" in X)
>
> However that fails with
>
> Traceback (most recent call last):
> File "x.py", line 10, in <module>
> print("one" in X)
> TypeError: argument of type 'type' is not iterable
>
> My understanding was that "in" makes use of an available __contains__
> but something seems to preventing Python from finding that.
>
> What's going on here?
>
Maybe it's just because it's intended to be an instance method, like
__getitem__.
More information about the Python-list
mailing list