mirror of https://github.com/python/cpython
that have __private names in their __slots__.
This commit is contained in:
parent
43f08a85e4
commit
22ec80bc4f
|
@ -116,8 +116,19 @@ def _slotnames(cls):
|
|||
# Slots found -- gather slot names from all base classes
|
||||
for c in cls.__mro__:
|
||||
if "__slots__" in c.__dict__:
|
||||
names += [name for name in c.__dict__["__slots__"]
|
||||
if name not in ("__dict__", "__weakref__")]
|
||||
slots = c.__dict__['__slots__']
|
||||
# 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
|
||||
try:
|
||||
|
|
|
@ -8,6 +8,22 @@ class C:
|
|||
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):
|
||||
|
||||
def test_class(self):
|
||||
|
@ -84,6 +100,19 @@ class CopyRegTestCase(unittest.TestCase):
|
|||
self.assertRaises(ValueError, copy_reg.add_extension,
|
||||
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():
|
||||
test_support.run_unittest(CopyRegTestCase)
|
||||
|
||||
|
|
Loading…
Reference in New Issue