mirror of
https://github.com/python/cpython.git
synced 2025-12-21 08:01:36 +00:00
that have __private names in their __slots__.
This commit is contained in:
parent
43f08a85e4
commit
22ec80bc4f
3 changed files with 45 additions and 2 deletions
|
|
@ -116,8 +116,19 @@ def _slotnames(cls):
|
||||||
# Slots found -- gather slot names from all base classes
|
# Slots found -- gather slot names from all base classes
|
||||||
for c in cls.__mro__:
|
for c in cls.__mro__:
|
||||||
if "__slots__" in c.__dict__:
|
if "__slots__" in c.__dict__:
|
||||||
names += [name for name in c.__dict__["__slots__"]
|
slots = c.__dict__['__slots__']
|
||||||
if name not in ("__dict__", "__weakref__")]
|
# if class has a single slot, it can be given as a string
|
||||||
|
if isinstance(slots, basestring):
|
||||||
|
slots = (slots,)
|
||||||
|
for name in slots:
|
||||||
|
# special descriptors
|
||||||
|
if name in ("__dict__", "__weakref__"):
|
||||||
|
continue
|
||||||
|
# mangled names
|
||||||
|
elif name.startswith('__') and not name.endswith('__'):
|
||||||
|
names.append('_%s%s' % (c.__name__, name))
|
||||||
|
else:
|
||||||
|
names.append(name)
|
||||||
|
|
||||||
# Cache the outcome in the class if at all possible
|
# Cache the outcome in the class if at all possible
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,22 @@ class C:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WithoutSlots(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WithWeakref(object):
|
||||||
|
__slots__ = ('__weakref__',)
|
||||||
|
|
||||||
|
class WithPrivate(object):
|
||||||
|
__slots__ = ('__spam',)
|
||||||
|
|
||||||
|
class WithSingleString(object):
|
||||||
|
__slots__ = 'spam'
|
||||||
|
|
||||||
|
class WithInherited(WithSingleString):
|
||||||
|
__slots__ = ('eggs',)
|
||||||
|
|
||||||
|
|
||||||
class CopyRegTestCase(unittest.TestCase):
|
class CopyRegTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def test_class(self):
|
def test_class(self):
|
||||||
|
|
@ -84,6 +100,19 @@ class CopyRegTestCase(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, copy_reg.add_extension,
|
self.assertRaises(ValueError, copy_reg.add_extension,
|
||||||
mod, func, code)
|
mod, func, code)
|
||||||
|
|
||||||
|
def test_slotnames(self):
|
||||||
|
self.assertEquals(copy_reg._slotnames(WithoutSlots), [])
|
||||||
|
self.assertEquals(copy_reg._slotnames(WithWeakref), [])
|
||||||
|
expected = ['_WithPrivate__spam']
|
||||||
|
self.assertEquals(copy_reg._slotnames(WithPrivate), expected)
|
||||||
|
self.assertEquals(copy_reg._slotnames(WithSingleString), ['spam'])
|
||||||
|
expected = ['eggs', 'spam']
|
||||||
|
expected.sort()
|
||||||
|
result = copy_reg._slotnames(WithInherited)
|
||||||
|
result.sort()
|
||||||
|
self.assertEquals(result, expected)
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test_support.run_unittest(CopyRegTestCase)
|
test_support.run_unittest(CopyRegTestCase)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -487,6 +487,9 @@ Extension Modules
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Patch #1462313, bug #1443328: the pickle modules now can handle classes
|
||||||
|
that have __private names in their __slots__.
|
||||||
|
|
||||||
- Bug #1250170: mimetools now gracefully handles socket.gethostname()
|
- Bug #1250170: mimetools now gracefully handles socket.gethostname()
|
||||||
failures gracefully.
|
failures gracefully.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue