Created
November 26, 2015 17:42
-
-
Save nicoddemus/6ff14f94dac4f6b1d5f5 to your computer and use it in GitHub Desktop.
warnings snippets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Code typically replaced by _warnings | |
def warn(message, category=None, stacklevel=1): | |
"""Issue a warning, or maybe ignore it or raise an exception.""" | |
# Check if message is already a Warning object | |
if isinstance(message, Warning): | |
category = message.__class__ | |
# Check category argument | |
if category is None: | |
category = UserWarning | |
if not (isinstance(category, type) and issubclass(category, Warning)): | |
raise TypeError("category must be a Warning subclass, " | |
"not '{:s}'".format(type(category).__name__)) | |
# Get context information | |
try: | |
if stacklevel <= 1 or _is_internal_frame(sys._getframe(1)): | |
# If frame is too small to care or if the warning originated in | |
# internal code, then do not try to hide any frames. | |
frame = sys._getframe(stacklevel) | |
else: | |
frame = sys._getframe(1) | |
# Look for one frame less since the above line starts us off. | |
for x in range(stacklevel-1): | |
frame = _next_external_frame(frame) | |
if frame is None: | |
raise ValueError | |
except ValueError: | |
globals = sys.__dict__ | |
lineno = 1 | |
else: | |
globals = frame.f_globals | |
lineno = frame.f_lineno | |
if '__name__' in globals: | |
module = globals['__name__'] | |
else: | |
module = "<string>" | |
filename = globals.get('__file__') | |
if filename: | |
fnl = filename.lower() | |
if fnl.endswith(".pyc"): | |
filename = filename[:-1] | |
else: | |
if module == "__main__": | |
try: | |
filename = sys.argv[0] | |
except AttributeError: | |
# embedded interpreters don't have sys.argv, see bug #839151 | |
filename = '__main__' | |
if not filename: | |
filename = module | |
registry = globals.setdefault("__warningregistry__", {}) | |
warn_explicit(message, category, filename, lineno, module, registry, | |
globals) | |
def warn_explicit(message, category, filename, lineno, | |
module=None, registry=None, module_globals=None): | |
lineno = int(lineno) | |
if module is None: | |
module = filename or "<unknown>" | |
if module[-3:].lower() == ".py": | |
module = module[:-3] # XXX What about leading pathname? | |
if registry is None: | |
registry = {} | |
if registry.get('version', 0) != _filters_version: | |
registry.clear() | |
registry['version'] = _filters_version | |
if isinstance(message, Warning): | |
text = str(message) | |
category = message.__class__ | |
else: | |
text = message | |
message = category(message) | |
key = (text, category, lineno) | |
# Quick test for common case | |
if registry.get(key): | |
return | |
# Search the filters | |
for item in filters: | |
action, msg, cat, mod, ln = item | |
if ((msg is None or msg.match(text)) and | |
issubclass(category, cat) and | |
(mod is None or mod.match(module)) and | |
(ln == 0 or lineno == ln)): | |
break | |
else: | |
action = defaultaction | |
# Early exit actions | |
if action == "ignore": | |
registry[key] = 1 | |
return | |
# Prime the linecache for formatting, in case the | |
# "file" is actually in a zipfile or something. | |
import linecache | |
linecache.getlines(filename, module_globals) | |
if action == "error": | |
raise message | |
# Other actions | |
if action == "once": | |
registry[key] = 1 | |
oncekey = (text, category) | |
if onceregistry.get(oncekey): | |
return | |
onceregistry[oncekey] = 1 | |
elif action == "always": | |
pass | |
elif action == "module": | |
registry[key] = 1 | |
altkey = (text, category, 0) | |
if registry.get(altkey): | |
return | |
registry[altkey] = 1 | |
elif action == "default": | |
registry[key] = 1 | |
else: | |
# Unrecognized actions are errors | |
raise RuntimeError( | |
"Unrecognized action (%r) in warnings.filters:\n %s" % | |
(action, item)) | |
if not callable(showwarning): | |
raise TypeError("warnings.showwarning() must be set to a " | |
"function or method") | |
# Print message and context | |
showwarning(message, category, filename, lineno) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment