summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorChris Barker <Chris.Barker@noaa.gov>2024-09-13 23:36:40 (GMT)
committerGitHub <noreply@github.com>2024-09-13 23:36:40 (GMT)
commit38809171b8768517824fb62d48abe2cb0aff8429 (patch)
tree6e3b691a518adeb9504bdcfdab653b8ca54f5cb3 /Doc
parentcd06f5e32369c7816c7360cbb20fbe9f38b4f3a7 (diff)
downloadcpython-38809171b8768517824fb62d48abe2cb0aff8429.zip
cpython-38809171b8768517824fb62d48abe2cb0aff8429.tar.gz
cpython-38809171b8768517824fb62d48abe2cb0aff8429.tar.bz2
gh-121607: Edited source file import recipe to make it more clear (#121519)
Co-authored-by: Brett Cannon <brett@python.org> Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Diffstat (limited to 'Doc')
-rw-r--r--Doc/library/importlib.rst37
1 files changed, 25 insertions, 12 deletions
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
index 1206a2d..d0a3d9d 100644
--- a/Doc/library/importlib.rst
+++ b/Doc/library/importlib.rst
@@ -1584,20 +1584,34 @@ Note that if ``name`` is a submodule (contains a dot),
Importing a source file directly
''''''''''''''''''''''''''''''''
-To import a Python source file directly, use the following recipe::
+This recipe should be used with caution: it is an approximation of an import
+statement where the file path is specified directly, rather than
+:data:`sys.path` being searched. Alternatives should first be considered first,
+such as modifying :data:`sys.path` when a proper module is required, or using
+:func:`runpy.run_path` when the global namespace resulting from running a Python
+file is appropriate.
- import importlib.util
- import sys
+To import a Python source file directly from a path, use the following recipe::
+
+ import importlib.util
+ import sys
- # For illustrative purposes.
- import tokenize
- file_path = tokenize.__file__
- module_name = tokenize.__name__
- spec = importlib.util.spec_from_file_location(module_name, file_path)
- module = importlib.util.module_from_spec(spec)
- sys.modules[module_name] = module
- spec.loader.exec_module(module)
+ def import_from_path(module_name, file_path):
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
+ module = importlib.util.module_from_spec(spec)
+ sys.modules[module_name] = module
+ spec.loader.exec_module(module)
+ return module
+
+
+ # For illustrative purposes only (use of `json` is arbitrary).
+ import json
+ file_path = json.__file__
+ module_name = json.__name__
+
+ # Similar outcome as `import json`.
+ json = import_from_path(module_name, file_path)
Implementing lazy imports
@@ -1623,7 +1637,6 @@ The example below shows how to implement lazy imports::
False
-
Setting up an importer
''''''''''''''''''''''