Merge 3.6

This commit is contained in:
Victor Stinner 2016-12-06 10:59:54 +01:00
commit 01928f6c0f
3 changed files with 60 additions and 2 deletions

View File

@ -944,6 +944,51 @@ class CatchWarningTests(BaseTest):
self.assertTrue(wmod.filters is not orig_filters) self.assertTrue(wmod.filters is not orig_filters)
self.assertTrue(wmod.filters is orig_filters) self.assertTrue(wmod.filters is orig_filters)
def test_record_override_showwarning_before(self):
# Issue #28089: If warnings.showwarning() was overriden, make sure
# that catch_warnings(record=True) overrides it again.
text = "This is a warning"
wmod = self.module
my_log = []
def my_logger(message, category, filename, lineno, file=None, line=None):
nonlocal my_log
my_log.append(message)
# Override warnings.showwarning() before calling catch_warnings()
with support.swap_attr(wmod, 'showwarning', my_logger):
with wmod.catch_warnings(module=wmod, record=True) as log:
self.assertIsNot(wmod.showwarning, my_logger)
wmod.simplefilter("always")
wmod.warn(text)
self.assertIs(wmod.showwarning, my_logger)
self.assertEqual(len(log), 1, log)
self.assertEqual(log[0].message.args[0], text)
self.assertEqual(my_log, [])
def test_record_override_showwarning_inside(self):
# Issue #28089: It is possible to override warnings.showwarning()
# in the catch_warnings(record=True) context manager.
text = "This is a warning"
wmod = self.module
my_log = []
def my_logger(message, category, filename, lineno, file=None, line=None):
nonlocal my_log
my_log.append(message)
with wmod.catch_warnings(module=wmod, record=True) as log:
wmod.simplefilter("always")
wmod.showwarning = my_logger
wmod.warn(text)
self.assertEqual(len(my_log), 1, my_log)
self.assertEqual(my_log[0].args[0], text)
self.assertEqual(log, [])
def test_check_warnings(self): def test_check_warnings(self):
# Explicit tests for the test.support convenience wrapper # Explicit tests for the test.support convenience wrapper
wmod = self.module wmod = self.module

View File

@ -447,11 +447,20 @@ class catch_warnings(object):
self._module._filters_mutated() self._module._filters_mutated()
self._showwarning = self._module.showwarning self._showwarning = self._module.showwarning
self._showwarnmsg = self._module._showwarnmsg self._showwarnmsg = self._module._showwarnmsg
self._showwarnmsg_impl = self._module._showwarnmsg_impl
if self._record: if self._record:
log = [] log = []
def showarnmsg(msg):
def showarnmsg_logger(msg):
nonlocal log
log.append(msg) log.append(msg)
self._module._showwarnmsg = showarnmsg
self._module._showwarnmsg_impl = showarnmsg_logger
# Reset showwarning() to the default implementation to make sure
# that _showwarnmsg() calls _showwarnmsg_impl()
self._module.showwarning = self._module._showwarning
return log return log
else: else:
return None return None
@ -463,6 +472,7 @@ class catch_warnings(object):
self._module._filters_mutated() self._module._filters_mutated()
self._module.showwarning = self._showwarning self._module.showwarning = self._showwarning
self._module._showwarnmsg = self._showwarnmsg self._module._showwarnmsg = self._showwarnmsg
self._module._showwarnmsg_impl = self._showwarnmsg_impl
# filters contains a sequence of filter 5-tuples # filters contains a sequence of filter 5-tuples

View File

@ -165,6 +165,9 @@ Core and Builtins
Library Library
------- -------
- Issue #28089: Fix a regression introduced in warnings.catch_warnings():
call warnings.showwarning() if it was overriden inside the context manager.
- Issue #27172: To assist with upgrades from 2.7, the previously documented - Issue #27172: To assist with upgrades from 2.7, the previously documented
deprecation of ``inspect.getfullargspec()`` has been reversed. This decision deprecation of ``inspect.getfullargspec()`` has been reversed. This decision
may be revisited again after the Python 2.7 branch is no longer officially may be revisited again after the Python 2.7 branch is no longer officially