From 90c3018dec89cf68c7beac4c5491024f6bc01101 Mon Sep 17 00:00:00 2001 From: barneygale Date: Sat, 18 Nov 2023 18:23:31 +0000 Subject: [PATCH] GH-77621: Delay some imports from pathlib Import `contextlib`, `glob` and `re` only as required. --- Lib/pathlib.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 73f87b9acbf9d5..b0221afd553c6a 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 @@ -80,12 +77,13 @@ def _is_case_sensitive(pathmod): def _compile_pattern(pat, sep, case_sensitive): """Compile given glob pattern to a re.Pattern object (observing case sensitivity).""" - flags = re.NOFLAG if case_sensitive else re.IGNORECASE - regex = glob.translate(pat, recursive=True, include_hidden=True, seps=sep) + from glob import translate + regex = 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 + from re import compile, NOFLAG, IGNORECASE + return compile(regex, flags=NOFLAG if case_sensitive else IGNORECASE).match def _select_children(parent_paths, dir_only, follow_symlinks, match): @@ -989,7 +987,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)