[Python-checkins] cpython (3.5): Issue #23977: Tweak IDLE Delegator and its test.

terry.reedy python-checkins at python.org
Sun May 15 22:07:26 EDT 2016


https://hg.python.org/cpython/rev/6bc08af57813
changeset:   101351:6bc08af57813
branch:      3.5
parent:      101349:5f561804bc8e
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Sun May 15 22:06:49 2016 -0400
summary:
  Issue #23977: Tweak IDLE Delegator and its test.

files:
  Lib/idlelib/Delegator.py                |  12 +++++-
  Lib/idlelib/idle_test/test_delegator.py |  23 +++++++-----
  2 files changed, 23 insertions(+), 12 deletions(-)


diff --git a/Lib/idlelib/Delegator.py b/Lib/idlelib/Delegator.py
--- a/Lib/idlelib/Delegator.py
+++ b/Lib/idlelib/Delegator.py
@@ -1,10 +1,10 @@
 class Delegator:
 
-    # The cache is only used to be able to change delegates!
-
     def __init__(self, delegate=None):
         self.delegate = delegate
         self.__cache = set()
+        # Cache is used to only remove added attributes
+        # when changing the delegate.
 
     def __getattr__(self, name):
         attr = getattr(self.delegate, name) # May raise AttributeError
@@ -13,6 +13,9 @@
         return attr
 
     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:
             try:
                 delattr(self, key)
@@ -21,5 +24,10 @@
         self.__cache.clear()
 
     def setdelegate(self, delegate):
+        "Reset attributes and change delegate."
         self.resetcache()
         self.delegate = delegate
+
+if __name__ == '__main__':
+    from unittest import main
+    main('idlelib.idle_test.test_delegator', verbosity=2)
diff --git a/Lib/idlelib/idle_test/test_delegator.py b/Lib/idlelib/idle_test/test_delegator.py
--- a/Lib/idlelib/idle_test/test_delegator.py
+++ b/Lib/idlelib/idle_test/test_delegator.py
@@ -4,34 +4,37 @@
 class DelegatorTest(unittest.TestCase):
 
     def test_mydel(self):
-        # test a simple use scenario
+        # Test a simple use scenario.
 
-        # initialize
+        # Initialize an int delegator.
         mydel = Delegator(int)
         self.assertIs(mydel.delegate, int)
         self.assertEqual(mydel._Delegator__cache, set())
+        # Trying to access a non-attribute of int fails.
+        self.assertRaises(AttributeError, mydel.__getattr__, 'xyz')
 
-        # add an attribute:
-        self.assertRaises(AttributeError, mydel.__getattr__, 'xyz')
+        # Add real int attribute 'bit_length' by accessing it.
         bl = mydel.bit_length
         self.assertIs(bl, int.bit_length)
         self.assertIs(mydel.__dict__['bit_length'], int.bit_length)
         self.assertEqual(mydel._Delegator__cache, {'bit_length'})
 
-        # add a second attribute
+        # Add attribute 'numerator'.
         mydel.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
         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
-        mydel.setdelegate(float)
-        self.assertIs(mydel.delegate, float)
+        # Change delegate to float, first resetting the attributes.
+        mydel.setdelegate(float)  # calls resetcache
         self.assertNotIn('bit_length', mydel.__dict__)
         self.assertEqual(mydel._Delegator__cache, set())
+        self.assertIs(mydel.delegate, float)
 
 if __name__ == '__main__':
     unittest.main(verbosity=2, exit=2)

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list