diff options
author | Shane Harvey <shane.harvey@mongodb.com> | 2017-08-05 15:01:10 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2017-08-05 15:01:10 (GMT) |
commit | 4795ba857ef2a89e6b477285df961672106a1792 (patch) | |
tree | 7fcf4caf59fc962aa7171c43878f687fc6916a1e | |
parent | a0cb7db8e4b928b4c06da4bde8695555276958f0 (diff) | |
download | cpython-4795ba857ef2a89e6b477285df961672106a1792.zip cpython-4795ba857ef2a89e6b477285df961672106a1792.tar.gz cpython-4795ba857ef2a89e6b477285df961672106a1792.tar.bz2 |
[3.6] bpo-31107: Fix copyreg mangled slot names calculation. (GH-2989) (#3003)
(cherry picked from commit c4c9866064f03646c686d7e08b00aeb203c35c19)
-rw-r--r-- | Lib/copyreg.py | 6 | ||||
-rw-r--r-- | Lib/test/test_copyreg.py | 10 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst | 2 |
4 files changed, 18 insertions, 1 deletions
diff --git a/Lib/copyreg.py b/Lib/copyreg.py index 67f5bb0..cef9984 100644 --- a/Lib/copyreg.py +++ b/Lib/copyreg.py @@ -128,7 +128,11 @@ def _slotnames(cls): continue # mangled names elif name.startswith('__') and not name.endswith('__'): - names.append('_%s%s' % (c.__name__, name)) + stripped = c.__name__.lstrip('_') + if stripped: + names.append('_%s%s' % (stripped, name)) + else: + names.append(name) else: names.append(name) diff --git a/Lib/test/test_copyreg.py b/Lib/test/test_copyreg.py index 52e887c..e3f1cd8 100644 --- a/Lib/test/test_copyreg.py +++ b/Lib/test/test_copyreg.py @@ -16,6 +16,12 @@ class WithWeakref(object): class WithPrivate(object): __slots__ = ('__spam',) +class _WithLeadingUnderscoreAndPrivate(object): + __slots__ = ('__spam',) + +class ___(object): + __slots__ = ('__spam',) + class WithSingleString(object): __slots__ = 'spam' @@ -104,6 +110,10 @@ class CopyRegTestCase(unittest.TestCase): self.assertEqual(copyreg._slotnames(WithWeakref), []) expected = ['_WithPrivate__spam'] self.assertEqual(copyreg._slotnames(WithPrivate), expected) + expected = ['_WithLeadingUnderscoreAndPrivate__spam'] + self.assertEqual(copyreg._slotnames(_WithLeadingUnderscoreAndPrivate), + expected) + self.assertEqual(copyreg._slotnames(___), ['__spam']) self.assertEqual(copyreg._slotnames(WithSingleString), ['spam']) expected = ['eggs', 'spam'] expected.sort() @@ -592,6 +592,7 @@ David Harrigan Brian Harring Jonathan Hartley Travis B. Hartwell +Shane Harvey Larry Hastings Tim Hatch Shane Hathaway diff --git a/Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst b/Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst new file mode 100644 index 0000000..3c2a155 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst @@ -0,0 +1,2 @@ +Fix `copyreg._slotnames()` mangled attribute calculation for classes whose +name begins with an underscore. Patch by Shane Harvey. |