blob: a1f774637a24f99b3746be30f8321cd5aed14198 [file] [log] [blame]
Guido van Rossum2a862c62000-12-15 21:59:53 +00001"""Python part of the warnings subsystem."""
2
Christian Heimes33fe8092008-04-13 13:53:33 +00003import sys
Guido van Rossum2a862c62000-12-15 21:59:53 +00004
Victor Stinner914cde82016-03-19 01:03:51 +01005
Brett Cannon14ad5312014-08-22 10:44:47 -04006__all__ = ["warn", "warn_explicit", "showwarning",
7 "formatwarning", "filterwarnings", "simplefilter",
Brett Cannon1cd02472008-09-09 01:52:27 +00008 "resetwarnings", "catch_warnings"]
Skip Montanaro40fc1602001-03-01 04:27:19 +00009
Christian Heimes33fe8092008-04-13 13:53:33 +000010def showwarning(message, category, filename, lineno, file=None, line=None):
Guido van Rossum2a862c62000-12-15 21:59:53 +000011 """Hook to write a warning to a file; replace if you like."""
Victor Stinner1231a462016-03-19 00:47:17 +010012 msg = WarningMessage(message, category, filename, lineno, file, line)
Victor Stinnereedf13f2016-03-19 02:11:56 +010013 _showwarnmsg_impl(msg)
Guido van Rossum2a862c62000-12-15 21:59:53 +000014
Christian Heimes33fe8092008-04-13 13:53:33 +000015def formatwarning(message, category, filename, lineno, line=None):
Guido van Rossum9464a7d2001-01-14 14:08:40 +000016 """Function to format a warning the standard way."""
Victor Stinner1231a462016-03-19 00:47:17 +010017 msg = WarningMessage(message, category, filename, lineno, None, line)
Victor Stinnereedf13f2016-03-19 02:11:56 +010018 return _formatwarnmsg_impl(msg)
Victor Stinner1231a462016-03-19 00:47:17 +010019
Victor Stinnereedf13f2016-03-19 02:11:56 +010020def _showwarnmsg_impl(msg):
Victor Stinner1231a462016-03-19 00:47:17 +010021 file = msg.file
22 if file is None:
23 file = sys.stderr
24 if file is None:
25 # sys.stderr is None when run with pythonw.exe:
26 # warnings get lost
27 return
28 text = _formatwarnmsg(msg)
29 try:
30 file.write(text)
31 except OSError:
32 # the file (probably stderr) is invalid - this warning gets lost.
33 pass
34
Victor Stinnereedf13f2016-03-19 02:11:56 +010035def _formatwarnmsg_impl(msg):
Victor Stinner1231a462016-03-19 00:47:17 +010036 s = ("%s:%s: %s: %s\n"
37 % (msg.filename, msg.lineno, msg.category.__name__,
38 msg.message))
Victor Stinnere091d322016-03-25 00:33:12 +010039
Victor Stinner1231a462016-03-19 00:47:17 +010040 if msg.line is None:
Victor Stinner27461682016-03-25 00:30:32 +010041 try:
42 import linecache
Victor Stinnere091d322016-03-25 00:33:12 +010043 line = linecache.getline(msg.filename, msg.lineno)
Victor Stinner27461682016-03-25 00:30:32 +010044 except Exception:
45 # When a warning is logged during Python shutdown, linecache
Martin Pantercc71a792016-04-05 06:19:42 +000046 # and the import machinery don't work anymore
Victor Stinner27461682016-03-25 00:30:32 +010047 line = None
Victor Stinnere091d322016-03-25 00:33:12 +010048 linecache = None
Victor Stinner1231a462016-03-19 00:47:17 +010049 else:
50 line = msg.line
Guido van Rossum2a862c62000-12-15 21:59:53 +000051 if line:
Christian Heimes33fe8092008-04-13 13:53:33 +000052 line = line.strip()
53 s += " %s\n" % line
Victor Stinnere091d322016-03-25 00:33:12 +010054
Victor Stinner914cde82016-03-19 01:03:51 +010055 if msg.source is not None:
Victor Stinnere091d322016-03-25 00:33:12 +010056 try:
57 import tracemalloc
58 tb = tracemalloc.get_object_traceback(msg.source)
59 except Exception:
60 # When a warning is logged during Python shutdown, tracemalloc
61 # and the import machinery don't work anymore
62 tb = None
63
Victor Stinner914cde82016-03-19 01:03:51 +010064 if tb is not None:
65 s += 'Object allocated at (most recent call first):\n'
66 for frame in tb:
67 s += (' File "%s", lineno %s\n'
68 % (frame.filename, frame.lineno))
Victor Stinnere091d322016-03-25 00:33:12 +010069
70 try:
71 if linecache is not None:
72 line = linecache.getline(frame.filename, frame.lineno)
73 else:
74 line = None
75 except Exception:
76 line = None
Victor Stinner914cde82016-03-19 01:03:51 +010077 if line:
78 line = line.strip()
79 s += ' %s\n' % line
Guido van Rossum2a862c62000-12-15 21:59:53 +000080 return s
81
Victor Stinnereedf13f2016-03-19 02:11:56 +010082# Keep a reference to check if the function was replaced
Ned Deilyc1c32922016-12-06 17:12:47 -050083_showwarning_orig = showwarning
Victor Stinnereedf13f2016-03-19 02:11:56 +010084
85def _showwarnmsg(msg):
86 """Hook to write a warning to a file; replace if you like."""
Ned Deilyc1c32922016-12-06 17:12:47 -050087 try:
88 sw = showwarning
89 except NameError:
90 pass
91 else:
92 if sw is not _showwarning_orig:
93 # warnings.showwarning() was replaced
94 if not callable(sw):
95 raise TypeError("warnings.showwarning() must be set to a "
96 "function or method")
Victor Stinnereedf13f2016-03-19 02:11:56 +010097
Ned Deilyc1c32922016-12-06 17:12:47 -050098 sw(msg.message, msg.category, msg.filename, msg.lineno,
99 msg.file, msg.line)
100 return
Victor Stinnereedf13f2016-03-19 02:11:56 +0100101 _showwarnmsg_impl(msg)
102
103# Keep a reference to check if the function was replaced
Ned Deilyc1c32922016-12-06 17:12:47 -0500104_formatwarning_orig = formatwarning
Victor Stinnereedf13f2016-03-19 02:11:56 +0100105
106def _formatwarnmsg(msg):
107 """Function to format a warning the standard way."""
Ned Deilyc1c32922016-12-06 17:12:47 -0500108 try:
109 fw = formatwarning
110 except NameError:
111 pass
112 else:
113 if fw is not _formatwarning_orig:
114 # warnings.formatwarning() was replaced
115 return fw(msg.message, msg.category,
116 msg.filename, msg.lineno, line=msg.line)
Victor Stinnereedf13f2016-03-19 02:11:56 +0100117 return _formatwarnmsg_impl(msg)
118
Guido van Rossum9464a7d2001-01-14 14:08:40 +0000119def filterwarnings(action, message="", category=Warning, module="", lineno=0,
Georg Brandlfe991052009-09-16 15:54:04 +0000120 append=False):
Guido van Rossum2a862c62000-12-15 21:59:53 +0000121 """Insert an entry into the list of warnings filters (at the front).
122
Georg Brandl495f7b52009-10-27 15:28:25 +0000123 'action' -- one of "error", "ignore", "always", "default", "module",
124 or "once"
125 'message' -- a regex that the warning message must match
126 'category' -- a class that the warning must be a subclass of
127 'module' -- a regex that the module name must match
128 'lineno' -- an integer line number, 0 matches all warnings
129 'append' -- if true, append to the list of filters
130 """
Skip Montanarod8f21202003-05-14 17:33:53 +0000131 import re
Guido van Rossum2a862c62000-12-15 21:59:53 +0000132 assert action in ("error", "ignore", "always", "default", "module",
Walter Dörwald70a6b492004-02-12 17:35:32 +0000133 "once"), "invalid action: %r" % (action,)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000134 assert isinstance(message, str), "message must be a string"
Guido van Rossum13257902007-06-07 23:15:56 +0000135 assert isinstance(category, type), "category must be a class"
Guido van Rossum2a862c62000-12-15 21:59:53 +0000136 assert issubclass(category, Warning), "category must be a Warning subclass"
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000137 assert isinstance(module, str), "module must be a string"
Walter Dörwald65230a22002-06-03 15:58:32 +0000138 assert isinstance(lineno, int) and lineno >= 0, \
Guido van Rossum2a862c62000-12-15 21:59:53 +0000139 "lineno must be an int >= 0"
Martin Panter43593a12016-05-26 09:10:55 +0000140 _add_filter(action, re.compile(message, re.I), category,
141 re.compile(module), lineno, append=append)
Guido van Rossum2a862c62000-12-15 21:59:53 +0000142
Georg Brandlfe991052009-09-16 15:54:04 +0000143def simplefilter(action, category=Warning, lineno=0, append=False):
Jeremy Hylton85014662003-07-11 15:37:59 +0000144 """Insert a simple entry into the list of warnings filters (at the front).
145
146 A simple filter matches all modules and messages.
Georg Brandl495f7b52009-10-27 15:28:25 +0000147 'action' -- one of "error", "ignore", "always", "default", "module",
148 or "once"
149 'category' -- a class that the warning must be a subclass of
150 'lineno' -- an integer line number, 0 matches all warnings
151 'append' -- if true, append to the list of filters
Jeremy Hylton85014662003-07-11 15:37:59 +0000152 """
153 assert action in ("error", "ignore", "always", "default", "module",
Walter Dörwald70a6b492004-02-12 17:35:32 +0000154 "once"), "invalid action: %r" % (action,)
Jeremy Hylton85014662003-07-11 15:37:59 +0000155 assert isinstance(lineno, int) and lineno >= 0, \
156 "lineno must be an int >= 0"
Martin Panter43593a12016-05-26 09:10:55 +0000157 _add_filter(action, None, category, None, lineno, append=append)
158
159def _add_filter(*item, append):
160 # Remove possible duplicate filters, so new one will be placed
161 # in correct place. If append=True and duplicate exists, do nothing.
162 if not append:
163 try:
164 filters.remove(item)
165 except ValueError:
166 pass
Jeremy Hylton85014662003-07-11 15:37:59 +0000167 filters.insert(0, item)
Martin Panter43593a12016-05-26 09:10:55 +0000168 else:
169 if item not in filters:
170 filters.append(item)
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200171 _filters_mutated()
Jeremy Hylton85014662003-07-11 15:37:59 +0000172
Guido van Rossum2a862c62000-12-15 21:59:53 +0000173def resetwarnings():
Tim Petersd0cc4f02002-04-16 01:51:25 +0000174 """Clear the list of warning filters, so that no filters are active."""
Guido van Rossum2a862c62000-12-15 21:59:53 +0000175 filters[:] = []
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200176 _filters_mutated()
Guido van Rossum2a862c62000-12-15 21:59:53 +0000177
178class _OptionError(Exception):
179 """Exception used by option processing helpers."""
180 pass
181
182# Helper to process -W options passed via sys.warnoptions
183def _processoptions(args):
184 for arg in args:
185 try:
186 _setoption(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000187 except _OptionError as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000188 print("Invalid -W option ignored:", msg, file=sys.stderr)
Guido van Rossum2a862c62000-12-15 21:59:53 +0000189
190# Helper for _processoptions()
191def _setoption(arg):
Skip Montanarod8f21202003-05-14 17:33:53 +0000192 import re
Tim Peterse1190062001-01-15 03:34:38 +0000193 parts = arg.split(':')
194 if len(parts) > 5:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000195 raise _OptionError("too many fields (max 5): %r" % (arg,))
Tim Peterse1190062001-01-15 03:34:38 +0000196 while len(parts) < 5:
197 parts.append('')
198 action, message, category, module, lineno = [s.strip()
199 for s in parts]
200 action = _getaction(action)
201 message = re.escape(message)
202 category = _getcategory(category)
203 module = re.escape(module)
204 if module:
205 module = module + '$'
206 if lineno:
207 try:
208 lineno = int(lineno)
209 if lineno < 0:
210 raise ValueError
211 except (ValueError, OverflowError):
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300212 raise _OptionError("invalid lineno %r" % (lineno,)) from None
Tim Peterse1190062001-01-15 03:34:38 +0000213 else:
214 lineno = 0
215 filterwarnings(action, message, category, module, lineno)
Guido van Rossum2a862c62000-12-15 21:59:53 +0000216
217# Helper for _setoption()
218def _getaction(action):
219 if not action:
220 return "default"
221 if action == "all": return "always" # Alias
Raymond Hettingerdbecd932005-02-06 06:57:08 +0000222 for a in ('default', 'always', 'ignore', 'module', 'once', 'error'):
Guido van Rossum2a862c62000-12-15 21:59:53 +0000223 if a.startswith(action):
224 return a
Walter Dörwald70a6b492004-02-12 17:35:32 +0000225 raise _OptionError("invalid action: %r" % (action,))
Guido van Rossum2a862c62000-12-15 21:59:53 +0000226
227# Helper for _setoption()
228def _getcategory(category):
Skip Montanarod8f21202003-05-14 17:33:53 +0000229 import re
Guido van Rossum2a862c62000-12-15 21:59:53 +0000230 if not category:
231 return Warning
232 if re.match("^[a-zA-Z0-9_]+$", category):
233 try:
234 cat = eval(category)
Guido van Rossumd1db30b2000-12-19 03:04:50 +0000235 except NameError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300236 raise _OptionError("unknown warning category: %r" % (category,)) from None
Guido van Rossum2a862c62000-12-15 21:59:53 +0000237 else:
238 i = category.rfind(".")
239 module = category[:i]
240 klass = category[i+1:]
Guido van Rossumd1db30b2000-12-19 03:04:50 +0000241 try:
Brett Cannoncd171c82013-07-04 17:43:24 -0400242 m = __import__(module, None, None, [klass])
243 except ImportError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300244 raise _OptionError("invalid module name: %r" % (module,)) from None
Guido van Rossumd1db30b2000-12-19 03:04:50 +0000245 try:
246 cat = getattr(m, klass)
247 except AttributeError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300248 raise _OptionError("unknown warning category: %r" % (category,)) from None
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000249 if not issubclass(cat, Warning):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000250 raise _OptionError("invalid warning category: %r" % (category,))
Guido van Rossum2a862c62000-12-15 21:59:53 +0000251 return cat
252
Christian Heimes33fe8092008-04-13 13:53:33 +0000253
Larry Hastings714e4932015-09-06 00:39:37 -0700254def _is_internal_frame(frame):
255 """Signal whether the frame is an internal CPython implementation detail."""
256 filename = frame.f_code.co_filename
257 return 'importlib' in filename and '_bootstrap' in filename
258
259
260def _next_external_frame(frame):
261 """Find the next frame that doesn't involve CPython internals."""
262 frame = frame.f_back
263 while frame is not None and _is_internal_frame(frame):
264 frame = frame.f_back
265 return frame
266
267
Christian Heimes33fe8092008-04-13 13:53:33 +0000268# Code typically replaced by _warnings
Victor Stinnere19558a2016-03-23 00:28:08 +0100269def warn(message, category=None, stacklevel=1, source=None):
Christian Heimes33fe8092008-04-13 13:53:33 +0000270 """Issue a warning, or maybe ignore it or raise an exception."""
271 # Check if message is already a Warning object
272 if isinstance(message, Warning):
273 category = message.__class__
274 # Check category argument
275 if category is None:
276 category = UserWarning
Berker Peksagd8089e02014-07-11 19:50:25 +0300277 if not (isinstance(category, type) and issubclass(category, Warning)):
278 raise TypeError("category must be a Warning subclass, "
279 "not '{:s}'".format(type(category).__name__))
Christian Heimes33fe8092008-04-13 13:53:33 +0000280 # Get context information
281 try:
Larry Hastings714e4932015-09-06 00:39:37 -0700282 if stacklevel <= 1 or _is_internal_frame(sys._getframe(1)):
283 # If frame is too small to care or if the warning originated in
284 # internal code, then do not try to hide any frames.
285 frame = sys._getframe(stacklevel)
286 else:
287 frame = sys._getframe(1)
288 # Look for one frame less since the above line starts us off.
289 for x in range(stacklevel-1):
290 frame = _next_external_frame(frame)
291 if frame is None:
292 raise ValueError
Christian Heimes33fe8092008-04-13 13:53:33 +0000293 except ValueError:
294 globals = sys.__dict__
295 lineno = 1
296 else:
Larry Hastings714e4932015-09-06 00:39:37 -0700297 globals = frame.f_globals
298 lineno = frame.f_lineno
Christian Heimes33fe8092008-04-13 13:53:33 +0000299 if '__name__' in globals:
300 module = globals['__name__']
301 else:
302 module = "<string>"
303 filename = globals.get('__file__')
304 if filename:
305 fnl = filename.lower()
Brett Cannonf299abd2015-04-13 14:21:02 -0400306 if fnl.endswith(".pyc"):
Christian Heimes33fe8092008-04-13 13:53:33 +0000307 filename = filename[:-1]
308 else:
309 if module == "__main__":
310 try:
311 filename = sys.argv[0]
312 except AttributeError:
313 # embedded interpreters don't have sys.argv, see bug #839151
314 filename = '__main__'
315 if not filename:
316 filename = module
317 registry = globals.setdefault("__warningregistry__", {})
318 warn_explicit(message, category, filename, lineno, module, registry,
Victor Stinnere19558a2016-03-23 00:28:08 +0100319 globals, source)
Christian Heimes33fe8092008-04-13 13:53:33 +0000320
321def warn_explicit(message, category, filename, lineno,
Victor Stinner914cde82016-03-19 01:03:51 +0100322 module=None, registry=None, module_globals=None,
323 source=None):
Brett Cannondb734912008-06-27 00:52:15 +0000324 lineno = int(lineno)
Christian Heimes33fe8092008-04-13 13:53:33 +0000325 if module is None:
326 module = filename or "<unknown>"
327 if module[-3:].lower() == ".py":
328 module = module[:-3] # XXX What about leading pathname?
329 if registry is None:
330 registry = {}
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200331 if registry.get('version', 0) != _filters_version:
332 registry.clear()
333 registry['version'] = _filters_version
Christian Heimes33fe8092008-04-13 13:53:33 +0000334 if isinstance(message, Warning):
335 text = str(message)
336 category = message.__class__
337 else:
338 text = message
339 message = category(message)
340 key = (text, category, lineno)
341 # Quick test for common case
342 if registry.get(key):
343 return
344 # Search the filters
345 for item in filters:
346 action, msg, cat, mod, ln = item
347 if ((msg is None or msg.match(text)) and
348 issubclass(category, cat) and
349 (mod is None or mod.match(module)) and
350 (ln == 0 or lineno == ln)):
351 break
352 else:
353 action = defaultaction
354 # Early exit actions
355 if action == "ignore":
356 registry[key] = 1
357 return
358
359 # Prime the linecache for formatting, in case the
360 # "file" is actually in a zipfile or something.
Antoine Pitrou7cb11fa2013-10-24 22:23:42 +0200361 import linecache
Christian Heimes33fe8092008-04-13 13:53:33 +0000362 linecache.getlines(filename, module_globals)
363
364 if action == "error":
365 raise message
366 # Other actions
367 if action == "once":
368 registry[key] = 1
369 oncekey = (text, category)
370 if onceregistry.get(oncekey):
371 return
372 onceregistry[oncekey] = 1
373 elif action == "always":
374 pass
375 elif action == "module":
376 registry[key] = 1
377 altkey = (text, category, 0)
378 if registry.get(altkey):
379 return
380 registry[altkey] = 1
381 elif action == "default":
382 registry[key] = 1
383 else:
384 # Unrecognized actions are errors
385 raise RuntimeError(
386 "Unrecognized action (%r) in warnings.filters:\n %s" %
387 (action, item))
388 # Print message and context
Victor Stinner914cde82016-03-19 01:03:51 +0100389 msg = WarningMessage(message, category, filename, lineno, source)
Victor Stinner1231a462016-03-19 00:47:17 +0100390 _showwarnmsg(msg)
Christian Heimes33fe8092008-04-13 13:53:33 +0000391
392
Brett Cannonec92e182008-09-02 02:46:59 +0000393class WarningMessage(object):
394
Brett Cannonec92e182008-09-02 02:46:59 +0000395 _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file",
Victor Stinner914cde82016-03-19 01:03:51 +0100396 "line", "source")
Brett Cannonec92e182008-09-02 02:46:59 +0000397
398 def __init__(self, message, category, filename, lineno, file=None,
Victor Stinner914cde82016-03-19 01:03:51 +0100399 line=None, source=None):
Alex Gaynor5de3a642017-06-04 11:34:16 -0400400 self.message = message
401 self.category = category
402 self.filename = filename
403 self.lineno = lineno
404 self.file = file
405 self.line = line
406 self.source = source
Brett Cannonec92e182008-09-02 02:46:59 +0000407 self._category_name = category.__name__ if category else None
408
409 def __str__(self):
410 return ("{message : %r, category : %r, filename : %r, lineno : %s, "
411 "line : %r}" % (self.message, self._category_name,
412 self.filename, self.lineno, self.line))
413
414
Brett Cannonec92e182008-09-02 02:46:59 +0000415class catch_warnings(object):
416
Brett Cannon1cd02472008-09-09 01:52:27 +0000417 """A context manager that copies and restores the warnings filter upon
418 exiting the context.
Brett Cannonec92e182008-09-02 02:46:59 +0000419
Brett Cannon1cd02472008-09-09 01:52:27 +0000420 The 'record' argument specifies whether warnings should be captured by a
421 custom implementation of warnings.showwarning() and be appended to a list
422 returned by the context manager. Otherwise None is returned by the context
423 manager. The objects appended to the list are arguments whose attributes
424 mirror the arguments to showwarning().
425
426 The 'module' argument is to specify an alternative module to the module
427 named 'warnings' and imported under that name. This argument is only useful
428 when testing the warnings module itself.
Brett Cannonec92e182008-09-02 02:46:59 +0000429
430 """
431
432 def __init__(self, *, record=False, module=None):
433 """Specify whether to record warnings and if an alternative module
434 should be used other than sys.modules['warnings'].
435
436 For compatibility with Python 3.0, please consider all arguments to be
437 keyword-only.
438
439 """
Brett Cannon1cd02472008-09-09 01:52:27 +0000440 self._record = record
Brett Cannonec92e182008-09-02 02:46:59 +0000441 self._module = sys.modules['warnings'] if module is None else module
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000442 self._entered = False
443
444 def __repr__(self):
445 args = []
446 if self._record:
447 args.append("record=True")
448 if self._module is not sys.modules['warnings']:
449 args.append("module=%r" % self._module)
450 name = type(self).__name__
451 return "%s(%s)" % (name, ", ".join(args))
Brett Cannonec92e182008-09-02 02:46:59 +0000452
453 def __enter__(self):
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000454 if self._entered:
455 raise RuntimeError("Cannot enter %r twice" % self)
456 self._entered = True
Brett Cannonec92e182008-09-02 02:46:59 +0000457 self._filters = self._module.filters
458 self._module.filters = self._filters[:]
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200459 self._module._filters_mutated()
Brett Cannonec92e182008-09-02 02:46:59 +0000460 self._showwarning = self._module.showwarning
Victor Stinner8ef46be2016-12-06 10:53:52 +0100461 self._showwarnmsg_impl = self._module._showwarnmsg_impl
Brett Cannon1cd02472008-09-09 01:52:27 +0000462 if self._record:
463 log = []
Ned Deilyc1c32922016-12-06 17:12:47 -0500464 self._module._showwarnmsg_impl = log.append
Victor Stinner8ef46be2016-12-06 10:53:52 +0100465 # Reset showwarning() to the default implementation to make sure
466 # that _showwarnmsg() calls _showwarnmsg_impl()
Ned Deilyc1c32922016-12-06 17:12:47 -0500467 self._module.showwarning = self._module._showwarning_orig
Brett Cannon1cd02472008-09-09 01:52:27 +0000468 return log
469 else:
470 return None
Brett Cannonec92e182008-09-02 02:46:59 +0000471
472 def __exit__(self, *exc_info):
Benjamin Petersonfcf5d632008-10-16 23:24:44 +0000473 if not self._entered:
474 raise RuntimeError("Cannot exit %r without entering first" % self)
Brett Cannonec92e182008-09-02 02:46:59 +0000475 self._module.filters = self._filters
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200476 self._module._filters_mutated()
Brett Cannonec92e182008-09-02 02:46:59 +0000477 self._module.showwarning = self._showwarning
Victor Stinner8ef46be2016-12-06 10:53:52 +0100478 self._module._showwarnmsg_impl = self._showwarnmsg_impl
Brett Cannonec92e182008-09-02 02:46:59 +0000479
480
Christian Heimes33fe8092008-04-13 13:53:33 +0000481# filters contains a sequence of filter 5-tuples
482# The components of the 5-tuple are:
483# - an action: error, ignore, always, default, module, or once
484# - a compiled regex that must match the warning message
485# - a class representing the warning category
486# - a compiled regex that must match the module that is being warned
487# - a line number for the line being warning, or 0 to mean any line
488# If either if the compiled regexs are None, match anything.
489_warnings_defaults = False
490try:
Brett Cannonef0e6c32010-09-04 18:24:04 +0000491 from _warnings import (filters, _defaultaction, _onceregistry,
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200492 warn, warn_explicit, _filters_mutated)
Brett Cannonef0e6c32010-09-04 18:24:04 +0000493 defaultaction = _defaultaction
494 onceregistry = _onceregistry
Christian Heimes33fe8092008-04-13 13:53:33 +0000495 _warnings_defaults = True
Brett Cannoncd171c82013-07-04 17:43:24 -0400496except ImportError:
Christian Heimes33fe8092008-04-13 13:53:33 +0000497 filters = []
498 defaultaction = "default"
499 onceregistry = {}
500
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200501 _filters_version = 1
502
503 def _filters_mutated():
504 global _filters_version
505 _filters_version += 1
506
Christian Heimes33fe8092008-04-13 13:53:33 +0000507
Guido van Rossum2a862c62000-12-15 21:59:53 +0000508# Module initialization
Tim Peters66025202004-03-21 17:06:20 +0000509_processoptions(sys.warnoptions)
Christian Heimes33fe8092008-04-13 13:53:33 +0000510if not _warnings_defaults:
Benjamin Peterson7ab4b8d2010-06-28 00:01:59 +0000511 silence = [ImportWarning, PendingDeprecationWarning]
512 silence.append(DeprecationWarning)
513 for cls in silence:
514 simplefilter("ignore", category=cls)
Christian Heimes33fe8092008-04-13 13:53:33 +0000515 bytes_warning = sys.flags.bytes_warning
516 if bytes_warning > 1:
517 bytes_action = "error"
518 elif bytes_warning:
519 bytes_action = "default"
520 else:
521 bytes_action = "ignore"
522 simplefilter(bytes_action, category=BytesWarning, append=1)
Georg Brandl08be72d2010-10-24 15:11:22 +0000523 # resource usage warnings are enabled by default in pydebug mode
524 if hasattr(sys, 'gettotalrefcount'):
525 resource_action = "always"
526 else:
527 resource_action = "ignore"
528 simplefilter(resource_action, category=ResourceWarning, append=1)
529
Christian Heimes33fe8092008-04-13 13:53:33 +0000530del _warnings_defaults