From 98ce7b107e6611d04dc35a4f5b02ea215ef122cf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 Jun 2020 19:11:50 +0200 Subject: [PATCH] bpo-41006: pkgutil imports lazily re (GH-20939) The pkgutil module now imports lazily the re module to speedup Python startup time. --- Lib/pkgutil.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index 4c184678a29..3d7f19f3998 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -7,7 +7,6 @@ import importlib.machinery import os import os.path -import re import sys from types import ModuleType import warnings @@ -638,9 +637,7 @@ def get_data(package, resource): return loader.get_data(resource_name) -_DOTTED_WORDS = r'(?!\d)(\w+)(\.(?!\d)(\w+))*' -_NAME_PATTERN = re.compile(f'^(?P{_DOTTED_WORDS})(?P:(?P{_DOTTED_WORDS})?)?$', re.U) -del _DOTTED_WORDS +_NAME_PATTERN = None def resolve_name(name): """ @@ -674,6 +671,15 @@ def resolve_name(name): AttributeError - if a failure occurred when traversing the object hierarchy within the imported package to get to the desired object) """ + global _NAME_PATTERN + if _NAME_PATTERN is None: + # Lazy import to speedup Python startup time + import re + dotted_words = r'(?!\d)(\w+)(\.(?!\d)(\w+))*' + _NAME_PATTERN = re.compile(f'^(?P{dotted_words})' + f'(?P:(?P{dotted_words})?)?$', + re.UNICODE) + m = _NAME_PATTERN.match(name) if not m: raise ValueError(f'invalid format: {name!r}')