From bbb4367b55ead1a0322d86b568c6c4607f539d3e Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Sat, 25 Nov 2023 17:41:05 +0000 Subject: [PATCH] GH-77621: Delay some imports from pathlib (#112244) Import `contextlib`, `glob` and `re` only as required. Co-authored-by: Alex Waygood --- Lib/pathlib.py | 14 +++++++++----- .../2023-11-21-02-58-14.gh-issue-77621.MYv5XS.rst | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2023-11-21-02-58-14.gh-issue-77621.MYv5XS.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 32ccf818b15..0e01099d490 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -5,14 +5,11 @@ operating systems. """ -import contextlib import functools -import glob import io import ntpath import os import posixpath -import re import sys import warnings from _collections_abc import Sequence @@ -75,17 +72,23 @@ def _is_case_sensitive(pathmod): # Globbing helpers # +re = glob = None + @functools.lru_cache(maxsize=256) def _compile_pattern(pat, sep, case_sensitive): """Compile given glob pattern to a re.Pattern object (observing case sensitivity).""" + global re, glob + if re is None: + import re, glob + flags = re.NOFLAG if case_sensitive else re.IGNORECASE regex = glob.translate(pat, recursive=True, include_hidden=True, seps=sep) # The string representation of an empty path is a single dot ('.'). Empty # paths shouldn't match wildcards, so we consume it with an atomic group. regex = r'(\.\Z)?+' + regex - return re.compile(regex, flags).match + return re.compile(regex, flags=flags).match def _select_children(parent_paths, dir_only, follow_symlinks, match): @@ -981,7 +984,8 @@ def iterdir(self): def _scandir(self): # Emulate os.scandir(), which returns an object that can be used as a # context manager. This method is called by walk() and glob(). - return contextlib.nullcontext(self.iterdir()) + from contextlib import nullcontext + return nullcontext(self.iterdir()) def _make_child_relpath(self, name): path_str = str(self) diff --git a/Misc/NEWS.d/next/Library/2023-11-21-02-58-14.gh-issue-77621.MYv5XS.rst b/Misc/NEWS.d/next/Library/2023-11-21-02-58-14.gh-issue-77621.MYv5XS.rst new file mode 100644 index 00000000000..f3e6efc389a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-11-21-02-58-14.gh-issue-77621.MYv5XS.rst @@ -0,0 +1,2 @@ +Slightly improve the import time of the :mod:`pathlib` module by deferring +some imports. Patch by Barney Gale.