diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2020-01-05 12:34:58 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-05 12:34:58 (GMT) |
commit | 43fbc70360b2a934ea809b2175d7e99031db2df3 (patch) | |
tree | b3d5638512d964a1dbcb6149449b1cadf1dd58e3 /Lib/warnings.py | |
parent | 3bdb2d9daf3ce41b325bd508e3dd29041e85dd1f (diff) | |
download | cpython-43fbc70360b2a934ea809b2175d7e99031db2df3.zip cpython-43fbc70360b2a934ea809b2175d7e99031db2df3.tar.gz cpython-43fbc70360b2a934ea809b2175d7e99031db2df3.tar.bz2 |
bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618)
No longer import the re module if it is not needed.
(cherry picked from commit 41ec17e45d54473d32f543396293256f1581e44d)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib/warnings.py')
-rw-r--r-- | Lib/warnings.py | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/Lib/warnings.py b/Lib/warnings.py index 9064f56..3e1715c 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -211,7 +211,6 @@ def _processoptions(args): # Helper for _processoptions() def _setoption(arg): - import re parts = arg.split(':') if len(parts) > 5: raise _OptionError("too many fields (max 5): %r" % (arg,)) @@ -220,11 +219,13 @@ def _setoption(arg): action, message, category, module, lineno = [s.strip() for s in parts] action = _getaction(action) - message = re.escape(message) category = _getcategory(category) - module = re.escape(module) + if message or module: + import re + if message: + message = re.escape(message) if module: - module = module + '$' + module = re.escape(module) + r'\Z' if lineno: try: lineno = int(lineno) @@ -248,26 +249,21 @@ def _getaction(action): # Helper for _setoption() def _getcategory(category): - import re if not category: return Warning - if re.match("^[a-zA-Z0-9_]+$", category): - try: - cat = eval(category) - except NameError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + if '.' not in category: + import builtins as m + klass = category else: - i = category.rfind(".") - module = category[:i] - klass = category[i+1:] + module, _, klass = category.rpartition('.') try: m = __import__(module, None, None, [klass]) except ImportError: raise _OptionError("invalid module name: %r" % (module,)) from None - try: - cat = getattr(m, klass) - except AttributeError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) from None if not issubclass(cat, Warning): raise _OptionError("invalid warning category: %r" % (category,)) return cat |