From 934aba66ef09e94422bcac86dd221011242e141d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 1 Feb 2017 10:55:58 -0800 Subject: [PATCH] Issue #29377: Add three new wrappers to types.py (Manuel Krebber). --- Doc/library/types.rst | 23 +++++++++++++++++++++++ Lib/test/test_types.py | 18 ++++++++++++++++++ Lib/types.py | 4 ++++ Misc/NEWS | 4 ++++ 4 files changed, 49 insertions(+) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 0c5619c713e..2602e3cf761 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -132,6 +132,29 @@ Standard names are defined for the following types: C".) +.. data:: SlotWrapperType + + The type of methods of some built-in data types and base classes such as + :meth:`object.__init__` or :meth:`object.__lt__`. + + .. versionadded:: 3.7 + + +.. data:: MethodWrapperType + + The type of *bound* methods of some built-in data types and base classes. + For example it is the type of :code:`object().__str__`. + + .. versionadded:: 3.7 + + +.. data:: MethodDescriptorType + + The type of methods of some built-in data types such as :meth:`str.join`. + + .. versionadded:: 3.7 + + .. class:: ModuleType(name, doc=None) The type of :term:`modules `. Constructor takes the name of the diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 382ca03e5ad..4a9fcba526a 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -576,6 +576,24 @@ class TypesTests(unittest.TestCase): self.assertGreater(object.__basicsize__, 0) self.assertGreater(tuple.__itemsize__, 0) + def test_slot_wrapper_types(self): + self.assertIsInstance(object.__init__, types.SlotWrapperType) + self.assertIsInstance(object.__str__, types.SlotWrapperType) + self.assertIsInstance(object.__lt__, types.SlotWrapperType) + self.assertIsInstance(int.__lt__, types.SlotWrapperType) + + def test_method_wrapper_types(self): + self.assertIsInstance(object().__init__, types.MethodWrapperType) + self.assertIsInstance(object().__str__, types.MethodWrapperType) + self.assertIsInstance(object().__lt__, types.MethodWrapperType) + self.assertIsInstance((42).__lt__, types.MethodWrapperType) + + def test_method_descriptor_types(self): + self.assertIsInstance(str.join, types.MethodDescriptorType) + self.assertIsInstance(list.append, types.MethodDescriptorType) + self.assertIsInstance(''.join, types.BuiltinMethodType) + self.assertIsInstance([].append, types.BuiltinMethodType) + class MappingProxyTests(unittest.TestCase): mappingproxy = types.MappingProxyType diff --git a/Lib/types.py b/Lib/types.py index d8d84709e1b..1b7859e73a1 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -36,6 +36,10 @@ MethodType = type(_C()._m) BuiltinFunctionType = type(len) BuiltinMethodType = type([].append) # Same as BuiltinFunctionType +SlotWrapperType = type(object.__init__) +MethodWrapperType = type(object().__str__) +MethodDescriptorType = type(str.join) + ModuleType = type(sys) try: diff --git a/Misc/NEWS b/Misc/NEWS index 2db05148845..21685d3a238 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -223,6 +223,10 @@ Extension Modules Library ------- +- Issue #29377: Add SlotWrapperType, MethodWrapperType, and + MethodDescriptorType built-in types to types module. + Original patch by Manuel Krebber. + - Issue #29218: Unused install_misc command is now removed. It has been documented as unused since 2000. Patch by Eric N. Vander Weele.