]> granicus.if.org Git - python/commitdiff
Close #18693: Enum is now more help() friendly.
authorEthan Furman <ethan@stoneleaf.us>
Sun, 15 Sep 2013 23:59:35 +0000 (16:59 -0700)
committerEthan Furman <ethan@stoneleaf.us>
Sun, 15 Sep 2013 23:59:35 +0000 (16:59 -0700)
Lib/enum.py
Lib/test/test_enum.py

index 40546da761c13bfd83607736e3d5babf169c0f05..86f94d905ff1f58389dcb9aced3b5dcf417508f4 100644 (file)
@@ -16,6 +16,8 @@ class _RouteClassAttributeToGetattr:
     """
     def __init__(self, fget=None):
         self.fget = fget
+        if fget.__doc__ is not None:
+            self.__doc__ = fget.__doc__
 
     def __get__(self, instance, ownerclass=None):
         if instance is None:
@@ -166,6 +168,7 @@ class EnumMeta(type):
                     enum_member._value_ = member_type(*args)
             value = enum_member._value_
             enum_member._name_ = member_name
+            enum_member.__objclass__ = enum_class
             enum_member.__init__(*args)
             # If another member with the same value was already defined, the
             # new member becomes an alias to the existing one.
@@ -229,7 +232,7 @@ class EnumMeta(type):
         return isinstance(member, cls) and member.name in cls._member_map_
 
     def __dir__(self):
-        return ['__class__', '__doc__', '__members__'] + self._member_names_
+        return ['__class__', '__doc__', '__members__', '__module__'] + self._member_names_
 
     def __getattr__(cls, name):
         """Return the enum member matching `name`
@@ -455,7 +458,8 @@ class Enum(metaclass=EnumMeta):
         return "%s.%s" % (self.__class__.__name__, self._name_)
 
     def __dir__(self):
-        return (['__class__', '__doc__', 'name', 'value'])
+        added_behavior = [m for m in self.__class__.__dict__ if m[0] != '_']
+        return ['__class__', '__doc__', '__module__', 'name', 'value'] + added_behavior
 
     def __eq__(self, other):
         if type(other) is self.__class__:
@@ -492,10 +496,12 @@ class Enum(metaclass=EnumMeta):
 
     @_RouteClassAttributeToGetattr
     def name(self):
+        """The name of the Enum member."""
         return self._name_
 
     @_RouteClassAttributeToGetattr
     def value(self):
+        """The value of the Enum member."""
         return self._value_
 
 
index 5d96d6d36ae9a80e63e1c7ae23fb8488e6c9c2d7..65d0de743a4b4fb96b2491e41b300b12c9fd4d10 100644 (file)
@@ -98,7 +98,7 @@ class TestEnum(unittest.TestCase):
         Season = self.Season
         self.assertEqual(
             set(dir(Season)),
-            set(['__class__', '__doc__', '__members__',
+            set(['__class__', '__doc__', '__members__', '__module__',
                 'SPRING', 'SUMMER', 'AUTUMN', 'WINTER']),
             )
 
@@ -106,9 +106,24 @@ class TestEnum(unittest.TestCase):
         Season = self.Season
         self.assertEqual(
             set(dir(Season.WINTER)),
-            set(['__class__', '__doc__', 'name', 'value']),
+            set(['__class__', '__doc__', '__module__', 'name', 'value']),
             )
 
+    def test_dir_with_added_behavior(self):
+        class Test(Enum):
+            this = 'that'
+            these = 'those'
+            def wowser(self):
+                return ("Wowser! I'm %s!" % self.name)
+        self.assertEqual(
+                set(dir(Test)),
+                set(['__class__', '__doc__', '__members__', '__module__', 'this', 'these']),
+                )
+        self.assertEqual(
+                set(dir(Test.this)),
+                set(['__class__', '__doc__', '__module__', 'name', 'value', 'wowser']),
+                )
+
     def test_enum_in_enum_out(self):
         Season = self.Season
         self.assertIs(Season(Season.WINTER), Season.WINTER)