summaryrefslogtreecommitdiff
path: root/Lib/idlelib/delegator.py
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2016-07-15 16:13:05 +0300
committerBerker Peksag <berker.peksag@gmail.com>2016-07-15 16:13:05 +0300
commiteefb633becc8ba6ae7d30c04aaa01a5740b92cbb (patch)
tree6a8d976e7b8f8426f64f6b1aa848b24363e2490a /Lib/idlelib/delegator.py
parent771fbd629810cb7dc48e10cc7d687b313c622fbf (diff)
parente30c0dfb84728e8c3f9e2f695b64071e53e1811b (diff)
downloadcpython-eefb633becc8ba6ae7d30c04aaa01a5740b92cbb.tar.gz
Issue #27518: Merge from 3.5
Diffstat (limited to 'Lib/idlelib/delegator.py')
-rw-r--r--Lib/idlelib/delegator.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/Lib/idlelib/delegator.py b/Lib/idlelib/delegator.py
new file mode 100644
index 0000000000..dc2a1aaeea
--- /dev/null
+++ b/Lib/idlelib/delegator.py
@@ -0,0 +1,33 @@
+class Delegator:
+
+ 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
+ setattr(self, name, attr)
+ self.__cache.add(name)
+ 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)
+ except AttributeError:
+ pass
+ 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)