import sys
import builtins as bltns
+from functools import partial
from types import MappingProxyType, DynamicClassAttribute
"""
Returns True if obj is a descriptor, False otherwise.
"""
- return (
+ return not isinstance(obj, partial) and (
hasattr(obj, '__get__') or
hasattr(obj, '__set__') or
hasattr(obj, '__delete__')
elif isinstance(value, nonmember):
# unwrap value here; it won't be processed by the below `else`
value = value.value
+ elif isinstance(value, partial):
+ import warnings
+ warnings.warn('functools.partial will be a method descriptor '
+ 'in future Python versions; wrap it in '
+ 'enum.member() if you want to preserve the '
+ 'old behavior', FutureWarning, stacklevel=2)
elif _is_descriptor(value):
pass
elif _is_internal_class(self._cls_name, value):
import builtins as bltns
from collections import OrderedDict
from datetime import date
+from functools import partial
from enum import Enum, EnumMeta, IntEnum, StrEnum, EnumType, Flag, IntFlag, unique, auto
from enum import STRICT, CONFORM, EJECT, KEEP, _simple_enum, _test_simple_enum
from enum import verify, UNIQUE, CONTINUOUS, NAMED_FLAGS, ReprEnum
[Outer.a, Outer.b, Outer.Inner],
)
+ def test_partial(self):
+ def func(a, b=5):
+ return a, b
+ with self.assertWarnsRegex(FutureWarning, r'partial.*enum\.member') as cm:
+ class E(Enum):
+ a = 1
+ b = partial(func)
+ self.assertEqual(cm.filename, __file__)
+ self.assertIsInstance(E.b, partial)
+ self.assertEqual(E.b(2), (2, 5))
+ with self.assertWarnsRegex(FutureWarning, 'partial'):
+ self.assertEqual(E.a.b(2), (2, 5))
+
def test_enum_with_value_name(self):
class Huh(Enum):
name = 1