diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2018-01-08 02:45:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-08 02:45:02 (GMT) |
commit | 9b99747386b690007027c3be2a5d7cfe3d3634f5 (patch) | |
tree | ba319d02ddc0e437bd0f90d520a4409efa7af6e2 /Lib | |
parent | d13889214a4c81b78fa8683d35bdbd17ff22f4fe (diff) | |
download | cpython-9b99747386b690007027c3be2a5d7cfe3d3634f5.zip cpython-9b99747386b690007027c3be2a5d7cfe3d3634f5.tar.gz cpython-9b99747386b690007027c3be2a5d7cfe3d3634f5.tar.bz2 |
bpo-31975 (PEP 565): Show DeprecationWarning in __main__ (GH-4458)
- primary change is to add a new default filter entry for
'default::DeprecationWarning:__main__'
- secondary change is an internal one to cope with plain
strings in the warning module's internal filter list
(this avoids the need to create a compiled regex object
early on during interpreter startup)
- assorted documentation updates, including many more
examples of configuring the warnings settings
- additional tests to ensure that both the pure Python and
the C accelerated warnings modules have the expected
default configuration
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_cmd_line.py | 2 | ||||
-rw-r--r-- | Lib/test/test_warnings/__init__.py | 36 | ||||
-rw-r--r-- | Lib/warnings.py | 4 |
3 files changed, 40 insertions, 2 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 54ea377..a6b6634 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -558,6 +558,7 @@ class CmdLineTest(unittest.TestCase): expected_filters = "default::Warning" else: expected_filters = ("default::Warning " + "default::DeprecationWarning " "ignore::DeprecationWarning " "ignore::PendingDeprecationWarning " "ignore::ImportWarning " @@ -626,6 +627,7 @@ class CmdLineTest(unittest.TestCase): "always::UserWarning") if not Py_DEBUG: expected_filters += (" " + "default::DeprecationWarning " "ignore::DeprecationWarning " "ignore::PendingDeprecationWarning " "ignore::ImportWarning " diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 039c96e..31ab94b 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -16,6 +16,8 @@ import warnings as original_warnings py_warnings = support.import_fresh_module('warnings', blocked=['_warnings']) c_warnings = support.import_fresh_module('warnings', fresh=['_warnings']) +Py_DEBUG = hasattr(sys, 'gettotalrefcount') + @contextmanager def warnings_state(module): """Use a specific warnings implementation in warning_tests.""" @@ -320,6 +322,7 @@ class FilterTests(BaseTest): self.module.filters[0][0], "error", "simplefilter did not promote filter to the beginning of list" ) + def test_append_duplicate(self): with original_warnings.catch_warnings(module=self.module, record=True) as w: @@ -1143,6 +1146,37 @@ class EnvironmentVariableTests(BaseTest): b" File \"<string>\", line 1, in <module>", b"DeprecationWarning: Message"]) + def test_default_filter_configuration(self): + pure_python_api = self.module is py_warnings + if Py_DEBUG: + expected_default_filters = [] + else: + if pure_python_api: + main_module_filter = re.compile("__main__") + else: + main_module_filter = "__main__" + expected_default_filters = [ + ('default', None, DeprecationWarning, main_module_filter, 0), + ('ignore', None, DeprecationWarning, None, 0), + ('ignore', None, PendingDeprecationWarning, None, 0), + ('ignore', None, ImportWarning, None, 0), + ('ignore', None, ResourceWarning, None, 0), + ] + expected_output = [str(f).encode() for f in expected_default_filters] + + if pure_python_api: + # Disable the warnings acceleration module in the subprocess + code = "import sys; sys.modules.pop('warnings', None); sys.modules['_warnings'] = None; " + else: + code = "" + code += "import warnings; [print(f) for f in warnings.filters]" + + rc, stdout, stderr = assert_python_ok("-c", code, __isolated=True) + stdout_lines = [line.strip() for line in stdout.splitlines()] + self.maxDiff = None + self.assertEqual(stdout_lines, expected_output) + + @unittest.skipUnless(sys.getfilesystemencoding() != 'ascii', 'requires non-ascii filesystemencoding') def test_nonascii(self): @@ -1192,7 +1226,7 @@ a=A() rc, out, err = assert_python_ok("-c", code) # note: "__main__" filename is not correct, it should be the name # of the script - self.assertEqual(err, b'__main__:7: UserWarning: test') + self.assertEqual(err.decode(), '__main__:7: UserWarning: test') def test_late_resource_warning(self): # Issue #21925: Emitting a ResourceWarning late during the Python diff --git a/Lib/warnings.py b/Lib/warnings.py index f4331c8..76ad4da 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -519,8 +519,10 @@ except ImportError: # Module initialization _processoptions(sys.warnoptions) if not _warnings_defaults: - # Several warning categories are ignored by default in Py_DEBUG builds + # Several warning categories are ignored by default in regular builds if not hasattr(sys, 'gettotalrefcount'): + filterwarnings("default", category=DeprecationWarning, + module="__main__", append=1) simplefilter("ignore", category=DeprecationWarning, append=1) simplefilter("ignore", category=PendingDeprecationWarning, append=1) simplefilter("ignore", category=ImportWarning, append=1) |