mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
Issue #23977: Tweak IDLE Delegator and its test.
This commit is contained in:
parent
5f4ac9fcf3
commit
33a8fb9920
2 changed files with 23 additions and 12 deletions
|
@ -1,10 +1,10 @@
|
||||||
class Delegator:
|
class Delegator:
|
||||||
|
|
||||||
# The cache is only used to be able to change delegates!
|
|
||||||
|
|
||||||
def __init__(self, delegate=None):
|
def __init__(self, delegate=None):
|
||||||
self.delegate = delegate
|
self.delegate = delegate
|
||||||
self.__cache = set()
|
self.__cache = set()
|
||||||
|
# Cache is used to only remove added attributes
|
||||||
|
# when changing the delegate.
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
attr = getattr(self.delegate, name) # May raise AttributeError
|
attr = getattr(self.delegate, name) # May raise AttributeError
|
||||||
|
@ -13,6 +13,9 @@ class Delegator:
|
||||||
return attr
|
return attr
|
||||||
|
|
||||||
def resetcache(self):
|
def resetcache(self):
|
||||||
|
"Removes added attributes while leaving original attributes."
|
||||||
|
# Function is really about resetting delagator dict
|
||||||
|
# to original state. Cache is just a means
|
||||||
for key in self.__cache:
|
for key in self.__cache:
|
||||||
try:
|
try:
|
||||||
delattr(self, key)
|
delattr(self, key)
|
||||||
|
@ -21,5 +24,10 @@ class Delegator:
|
||||||
self.__cache.clear()
|
self.__cache.clear()
|
||||||
|
|
||||||
def setdelegate(self, delegate):
|
def setdelegate(self, delegate):
|
||||||
|
"Reset attributes and change delegate."
|
||||||
self.resetcache()
|
self.resetcache()
|
||||||
self.delegate = delegate
|
self.delegate = delegate
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from unittest import main
|
||||||
|
main('idlelib.idle_test.test_delegator', verbosity=2)
|
||||||
|
|
|
@ -4,34 +4,37 @@ from idlelib.Delegator import Delegator
|
||||||
class DelegatorTest(unittest.TestCase):
|
class DelegatorTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_mydel(self):
|
def test_mydel(self):
|
||||||
# test a simple use scenario
|
# Test a simple use scenario.
|
||||||
|
|
||||||
# initialize
|
# Initialize an int delegator.
|
||||||
mydel = Delegator(int)
|
mydel = Delegator(int)
|
||||||
self.assertIs(mydel.delegate, int)
|
self.assertIs(mydel.delegate, int)
|
||||||
self.assertEqual(mydel._Delegator__cache, set())
|
self.assertEqual(mydel._Delegator__cache, set())
|
||||||
|
# Trying to access a non-attribute of int fails.
|
||||||
# add an attribute:
|
|
||||||
self.assertRaises(AttributeError, mydel.__getattr__, 'xyz')
|
self.assertRaises(AttributeError, mydel.__getattr__, 'xyz')
|
||||||
|
|
||||||
|
# Add real int attribute 'bit_length' by accessing it.
|
||||||
bl = mydel.bit_length
|
bl = mydel.bit_length
|
||||||
self.assertIs(bl, int.bit_length)
|
self.assertIs(bl, int.bit_length)
|
||||||
self.assertIs(mydel.__dict__['bit_length'], int.bit_length)
|
self.assertIs(mydel.__dict__['bit_length'], int.bit_length)
|
||||||
self.assertEqual(mydel._Delegator__cache, {'bit_length'})
|
self.assertEqual(mydel._Delegator__cache, {'bit_length'})
|
||||||
|
|
||||||
# add a second attribute
|
# Add attribute 'numerator'.
|
||||||
mydel.numerator
|
mydel.numerator
|
||||||
self.assertEqual(mydel._Delegator__cache, {'bit_length', 'numerator'})
|
self.assertEqual(mydel._Delegator__cache, {'bit_length', 'numerator'})
|
||||||
|
|
||||||
# delete the second (which, however, leaves it in the name cache)
|
# Delete 'numerator'.
|
||||||
del mydel.numerator
|
del mydel.numerator
|
||||||
self.assertNotIn('numerator', mydel.__dict__)
|
self.assertNotIn('numerator', mydel.__dict__)
|
||||||
self.assertIn('numerator', mydel._Delegator__cache)
|
# The current implementation leaves it in the name cache.
|
||||||
|
# self.assertIn('numerator', mydel._Delegator__cache)
|
||||||
|
# However, this is not required and not part of the specification
|
||||||
|
|
||||||
# reset by calling .setdelegate, which calls .resetcache
|
# Change delegate to float, first resetting the attributes.
|
||||||
mydel.setdelegate(float)
|
mydel.setdelegate(float) # calls resetcache
|
||||||
self.assertIs(mydel.delegate, float)
|
|
||||||
self.assertNotIn('bit_length', mydel.__dict__)
|
self.assertNotIn('bit_length', mydel.__dict__)
|
||||||
self.assertEqual(mydel._Delegator__cache, set())
|
self.assertEqual(mydel._Delegator__cache, set())
|
||||||
|
self.assertIs(mydel.delegate, float)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main(verbosity=2, exit=2)
|
unittest.main(verbosity=2, exit=2)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue