Kaydet (Commit) 52a7d982 authored tarafından Brett Cannon's avatar Brett Cannon

Make warnings accept a callable for showwarnings instead of

restricting itself to just functions and methods (which allows
built-in functions to be used, etc.).

Closes issue #10271. Thanks to lekma for the bug report.
üst b05be7d9
...@@ -512,12 +512,11 @@ class _WarningsTests(BaseTest): ...@@ -512,12 +512,11 @@ class _WarningsTests(BaseTest):
def test_showwarning_not_callable(self): def test_showwarning_not_callable(self):
with original_warnings.catch_warnings(module=self.module): with original_warnings.catch_warnings(module=self.module):
self.module.filterwarnings("always", category=UserWarning) self.module.filterwarnings("always", category=UserWarning)
old_showwarning = self.module.showwarning self.module.showwarning = print
with support.captured_output('stdout'):
self.module.warn('Warning!')
self.module.showwarning = 23 self.module.showwarning = 23
try: self.assertRaises(TypeError, self.module.warn, "Warning!")
self.assertRaises(TypeError, self.module.warn, "Warning!")
finally:
self.module.showwarning = old_showwarning
def test_show_warning_output(self): def test_show_warning_output(self):
# With showarning() missing, make sure that output is okay. # With showarning() missing, make sure that output is okay.
...@@ -547,10 +546,13 @@ class _WarningsTests(BaseTest): ...@@ -547,10 +546,13 @@ class _WarningsTests(BaseTest):
globals_dict = globals() globals_dict = globals()
oldfile = globals_dict['__file__'] oldfile = globals_dict['__file__']
try: try:
with original_warnings.catch_warnings(module=self.module) as w: catch = original_warnings.catch_warnings(record=True,
module=self.module)
with catch as w:
self.module.filterwarnings("always", category=UserWarning) self.module.filterwarnings("always", category=UserWarning)
globals_dict['__file__'] = None globals_dict['__file__'] = None
original_warnings.warn('test', UserWarning) original_warnings.warn('test', UserWarning)
self.assertTrue(len(w))
finally: finally:
globals_dict['__file__'] = oldfile globals_dict['__file__'] = oldfile
......
...@@ -409,10 +409,10 @@ warn_explicit(PyObject *category, PyObject *message, ...@@ -409,10 +409,10 @@ warn_explicit(PyObject *category, PyObject *message,
else { else {
PyObject *res; PyObject *res;
if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) { if (!PyCallable_Check(show_fxn)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"warnings.showwarning() must be set to a " "warnings.showwarning() must be set to a "
"function or method"); "callable");
Py_DECREF(show_fxn); Py_DECREF(show_fxn);
goto cleanup; goto cleanup;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment