The :class:`EnumMeta` metaclass is responsible for providing the
:meth:`__contains__`, :meth:`__dir__`, :meth:`__iter__` and other methods that
allow one to do things with an :class:`Enum` class that fail on a typical
-class, such as `list(Color)` or `some_var in Color`. :class:`EnumMeta` is
+class, such as `list(Color)` or `some_enum_var in Color`. :class:`EnumMeta` is
responsible for ensuring that various other methods on the final :class:`Enum`
class are correct (such as :meth:`__new__`, :meth:`__getnewargs__`,
:meth:`__str__` and :meth:`__repr__`).
return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start)
def __contains__(cls, member):
+ if not isinstance(member, Enum):
+ import warnings
+ warnings.warn(
+ "using non-Enums in containment checks will raise "
+ "TypeError in Python 3.8",
+ DeprecationWarning, 2)
return isinstance(member, cls) and member._name_ in cls._member_map_
def __delattr__(cls, attr):
def __contains__(self, other):
if not isinstance(other, self.__class__):
- return NotImplemented
+ import warnings
+ warnings.warn(
+ "using non-Flags in containment checks will raise "
+ "TypeError in Python 3.8",
+ DeprecationWarning, 2)
+ return False
return other._value_ & self._value_ == other._value_
def __repr__(self):
def test_contains(self):
Season = self.Season
self.assertIn(Season.AUTUMN, Season)
- self.assertNotIn(3, Season)
+ with self.assertWarns(DeprecationWarning):
+ self.assertNotIn(3, Season)
+ with self.assertWarns(DeprecationWarning):
+ self.assertNotIn('AUTUMN', Season)
val = Season(3)
self.assertIn(val, Season)
one = 1; two = 2
self.assertNotIn(OtherEnum.two, Season)
+ def test_member_contains(self):
+ self.assertRaises(TypeError, lambda: 'test' in self.Season.AUTUMN)
+ self.assertRaises(TypeError, lambda: 3 in self.Season.AUTUMN)
+ self.assertRaises(TypeError, lambda: 'AUTUMN' in self.Season.AUTUMN)
+
def test_comparisons(self):
Season = self.Season
with self.assertRaises(TypeError):
class Perm(Flag):
R, W, X = 4, 2, 1
+ class Color(Flag):
+ BLACK = 0
+ RED = 1
+ GREEN = 2
+ BLUE = 4
+ PURPLE = RED|BLUE
+
class Open(Flag):
RO = 0
WO = 1
test_pickle_dump_load(self.assertIs, FlagStooges.CURLY|FlagStooges.MOE)
test_pickle_dump_load(self.assertIs, FlagStooges)
- def test_containment(self):
+ def test_contains(self):
+ Open = self.Open
+ Color = self.Color
+ self.assertFalse(Color.BLACK in Open)
+ self.assertFalse(Open.RO in Color)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse('BLACK' in Color)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse('RO' in Open)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse(1 in Color)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse(1 in Open)
+
+ def test_member_contains(self):
Perm = self.Perm
R, W, X = Perm
RW = R | W
W = 1 << 1
R = 1 << 2
+ class Color(IntFlag):
+ BLACK = 0
+ RED = 1
+ GREEN = 2
+ BLUE = 4
+ PURPLE = RED|BLUE
+
class Open(IntFlag):
RO = 0
WO = 1
self.assertEqual(len(lst), len(Thing))
self.assertEqual(len(Thing), 0, Thing)
- def test_containment(self):
+ def test_contains(self):
+ Color = self.Color
+ Open = self.Open
+ self.assertTrue(Color.GREEN in Color)
+ self.assertTrue(Open.RW in Open)
+ self.assertFalse(Color.GREEN in Open)
+ self.assertFalse(Open.RW in Color)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse('GREEN' in Color)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse('RW' in Open)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse(2 in Color)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse(2 in Open)
+
+ def test_member_contains(self):
Perm = self.Perm
R, W, X = Perm
RW = R | W
self.assertFalse(R in WX)
self.assertFalse(W in RX)
self.assertFalse(X in RW)
+ with self.assertWarns(DeprecationWarning):
+ self.assertFalse('swallow' in RW)
def test_bool(self):
Perm = self.Perm