summaryrefslogtreecommitdiffstats
path: root/Lib/test/support
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-04-28 16:17:26 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2017-04-28 16:17:26 (GMT)
commitd1a1def7bf221b04dcf3fc3a67aa19aa2f622f83 (patch)
tree0d13f2482de3cad5c65d9507d1bb4a27234578a6 /Lib/test/support
parent80a3da4d4aad0b51893e1e2f696b6252eca80e07 (diff)
downloadcpython-d1a1def7bf221b04dcf3fc3a67aa19aa2f622f83.zip
cpython-d1a1def7bf221b04dcf3fc3a67aa19aa2f622f83.tar.gz
cpython-d1a1def7bf221b04dcf3fc3a67aa19aa2f622f83.tar.bz2
bpo-30197: Enhance functions swap_attr() and swap_item() in test.support. (#1341)
* bpo-30197: Enhance functions swap_attr() and swap_item() in test.support. They now work when delete replaced attribute or item inside the with statement. The old value of the attribute or item (or None if it doesn't exist) now will be assigned to the target of the "as" clause, if there is one. * Update docstrings.
Diffstat (limited to 'Lib/test/support')
-rw-r--r--Lib/test/support/__init__.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index ed611c9..d8d599b 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -2119,12 +2119,15 @@ def swap_attr(obj, attr, new_val):
restoring the old value at the end of the block. If `attr` doesn't
exist on `obj`, it will be created and then deleted at the end of the
block.
+
+ The old value (or None if it doesn't exist) will be assigned to the
+ target of the "as" clause, if there is one.
"""
if hasattr(obj, attr):
real_val = getattr(obj, attr)
setattr(obj, attr, new_val)
try:
- yield
+ yield real_val
finally:
setattr(obj, attr, real_val)
else:
@@ -2132,7 +2135,8 @@ def swap_attr(obj, attr, new_val):
try:
yield
finally:
- delattr(obj, attr)
+ if hasattr(obj, attr):
+ delattr(obj, attr)
@contextlib.contextmanager
def swap_item(obj, item, new_val):
@@ -2146,12 +2150,15 @@ def swap_item(obj, item, new_val):
restoring the old value at the end of the block. If `item` doesn't
exist on `obj`, it will be created and then deleted at the end of the
block.
+
+ The old value (or None if it doesn't exist) will be assigned to the
+ target of the "as" clause, if there is one.
"""
if item in obj:
real_val = obj[item]
obj[item] = new_val
try:
- yield
+ yield real_val
finally:
obj[item] = real_val
else:
@@ -2159,7 +2166,8 @@ def swap_item(obj, item, new_val):
try:
yield
finally:
- del obj[item]
+ if item in obj:
+ del obj[item]
def strip_python_stderr(stderr):
"""Strip the stderr of a Python process from potential debug output