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__.
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to