From f26d57e7f777fc662ec7b8a20c30ced36da88385 Mon Sep 17 00:00:00 2001 From: prakashdanish Date: Wed, 29 Aug 2018 15:04:47 +0530 Subject: [PATCH 1/3] bpo-34443: return __qualname__ in enum __repr__ repr of a class should return __qualname__ and not __name__ especially in nested classes --- Lib/enum.py | 2 +- Lib/test/test_enum.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index 9d1aef372c12fc2..bf549cddfb0164e 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -561,7 +561,7 @@ def _missing_(cls, value): def __repr__(self): return "<%s.%s: %r>" % ( - self.__class__.__name__, self._name_, self._value_) + self.__class__.__qualname__, self._name_, self._value_) def __str__(self): return "%s.%s" % (self.__class__.__name__, self._name_) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 68483e654254968..f4acc6b74146563 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -2584,9 +2584,9 @@ class Color(Enum): def test_pydoc(self): # indirectly test __objclass__ if StrEnum.__doc__ is None: - expected_text = expected_help_output_without_docs % __name__ + expected_text = expected_help_output_without_docs % self.__class__.__qualname__ else: - expected_text = expected_help_output_with_docs % __name__ + expected_text = expected_help_output_with_docs % self.__class__.__qualname__ output = StringIO() helper = pydoc.Helper(output=output) helper(self.Color) From 4140434f400aca90c1d292e7aab34ae2cab8ead2 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 10 Sep 2018 18:01:31 -0700 Subject: [PATCH 2/3] fix pydoc test for new __qualname__ usage --- Lib/test/test_pydoc.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 06f872999515fba..2ea1738ac504763 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -453,7 +453,8 @@ class BinaryInteger(enum.IntEnum): zero = 0 one = 1 doc = pydoc.render_doc(BinaryInteger) - self.assertIn('', doc) + # __qualname__ usage means more to check + self.assertIn(' Date: Mon, 10 Sep 2018 18:02:07 -0700 Subject: [PATCH 3/3] update Enum to use module and qualname in repr --- Lib/enum.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index bf549cddfb0164e..babe22f4ef8d2fe 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -164,6 +164,11 @@ def __new__(metacls, cls, bases, classdict): enum_class._member_names_ = [] # names in definition order enum_class._member_map_ = {} # name->value map enum_class._member_type_ = member_type + enum_class._module_qualname_ = ( + '%s.%s' % ( + enum_class.__module__, + enum_class.__qualname__.replace('..','.'), + )) # save attributes from super classes so we know if we can take # the shortcut of storing members in the class dict @@ -357,7 +362,7 @@ def __members__(cls): return MappingProxyType(cls._member_map_) def __repr__(cls): - return "" % cls.__name__ + return "" % cls._module_qualname_ def __reversed__(cls): return (cls._member_map_[name] for name in reversed(cls._member_names_)) @@ -425,6 +430,7 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s enum_class.__module__ = module if qualname is not None: enum_class.__qualname__ = qualname + enum_class._module_qualname_ = '%s.%s' % (module, qualname.replace('.locals.','.')) return enum_class @@ -560,8 +566,7 @@ def _missing_(cls, value): raise ValueError("%r is not a valid %s" % (value, cls.__name__)) def __repr__(self): - return "<%s.%s: %r>" % ( - self.__class__.__qualname__, self._name_, self._value_) + return "<%s.%s: %r>" % (self.__class__._module_qualname_, self._name_, self._value_) def __str__(self): return "%s.%s" % (self.__class__.__name__, self._name_)