summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNed Deily <nad@python.org>2016-12-06 22:12:47 (GMT)
committerNed Deily <nad@python.org>2016-12-06 22:12:47 (GMT)
commitc1c3292d588f19d989acc6283fb2dc5f1bdcfb34 (patch)
treef6d854ad99bfb81123a06afdaa03a8a429a4652c
parent9a5549598a3adb62173464a19d424d59b5e74797 (diff)
downloadcpython-c1c3292d588f19d989acc6283fb2dc5f1bdcfb34.zip
cpython-c1c3292d588f19d989acc6283fb2dc5f1bdcfb34.tar.gz
cpython-c1c3292d588f19d989acc6283fb2dc5f1bdcfb34.tar.bz2
Issue #28835: Tidy previous showwarning changes based on review comments.
Patch by Serhiy Storchaka.
-rw-r--r--Lib/warnings.py55
1 files changed, 27 insertions, 28 deletions
diff --git a/Lib/warnings.py b/Lib/warnings.py
index 0d16766..5badb0b 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -80,32 +80,40 @@ def _formatwarnmsg_impl(msg):
return s
# Keep a reference to check if the function was replaced
-_showwarning = showwarning
+_showwarning_orig = showwarning
def _showwarnmsg(msg):
"""Hook to write a warning to a file; replace if you like."""
- showwarning = globals().get('showwarning', _showwarning)
- if showwarning is not _showwarning:
- # warnings.showwarning() was replaced
- if not callable(showwarning):
- raise TypeError("warnings.showwarning() must be set to a "
- "function or method")
-
- showwarning(msg.message, msg.category, msg.filename, msg.lineno,
- msg.file, msg.line)
- return
+ try:
+ sw = showwarning
+ except NameError:
+ pass
+ else:
+ if sw is not _showwarning_orig:
+ # warnings.showwarning() was replaced
+ if not callable(sw):
+ raise TypeError("warnings.showwarning() must be set to a "
+ "function or method")
+
+ sw(msg.message, msg.category, msg.filename, msg.lineno,
+ msg.file, msg.line)
+ return
_showwarnmsg_impl(msg)
# Keep a reference to check if the function was replaced
-_formatwarning = formatwarning
+_formatwarning_orig = formatwarning
def _formatwarnmsg(msg):
"""Function to format a warning the standard way."""
- formatwarning = globals().get('formatwarning', _formatwarning)
- if formatwarning is not _formatwarning:
- # warnings.formatwarning() was replaced
- return formatwarning(msg.message, msg.category,
- msg.filename, msg.lineno, line=msg.line)
+ try:
+ fw = formatwarning
+ except NameError:
+ pass
+ else:
+ if fw is not _formatwarning_orig:
+ # warnings.formatwarning() was replaced
+ return fw(msg.message, msg.category,
+ msg.filename, msg.lineno, line=msg.line)
return _formatwarnmsg_impl(msg)
def filterwarnings(action, message="", category=Warning, module="", lineno=0,
@@ -446,21 +454,13 @@ class catch_warnings(object):
self._module.filters = self._filters[:]
self._module._filters_mutated()
self._showwarning = self._module.showwarning
- self._showwarnmsg = self._module._showwarnmsg
self._showwarnmsg_impl = self._module._showwarnmsg_impl
if self._record:
log = []
-
- def showarnmsg_logger(msg):
- nonlocal log
- log.append(msg)
-
- self._module._showwarnmsg_impl = showarnmsg_logger
-
+ self._module._showwarnmsg_impl = log.append
# Reset showwarning() to the default implementation to make sure
# that _showwarnmsg() calls _showwarnmsg_impl()
- self._module.showwarning = self._module._showwarning
-
+ self._module.showwarning = self._module._showwarning_orig
return log
else:
return None
@@ -471,7 +471,6 @@ class catch_warnings(object):
self._module.filters = self._filters
self._module._filters_mutated()
self._module.showwarning = self._showwarning
- self._module._showwarnmsg = self._showwarnmsg
self._module._showwarnmsg_impl = self._showwarnmsg_impl