Skip to content

Commit 3880917

Browse files
ChrisBarker-NOAAbrettcannonZeroIntensity
authoredSep 13, 2024··
gh-121607: Edited source file import recipe to make it more clear (#121519)
Co-authored-by: Brett Cannon <[email protected]> Co-authored-by: Peter Bierma <[email protected]>
1 parent cd06f5e commit 3880917

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed
 

Diff for: ‎Doc/library/importlib.rst

+25-12
Original file line numberDiff line numberDiff line change
@@ -1584,20 +1584,34 @@ Note that if ``name`` is a submodule (contains a dot),
15841584
Importing a source file directly
15851585
''''''''''''''''''''''''''''''''
15861586

1587-
To import a Python source file directly, use the following recipe::
1587+
This recipe should be used with caution: it is an approximation of an import
1588+
statement where the file path is specified directly, rather than
1589+
:data:`sys.path` being searched. Alternatives should first be considered first,
1590+
such as modifying :data:`sys.path` when a proper module is required, or using
1591+
:func:`runpy.run_path` when the global namespace resulting from running a Python
1592+
file is appropriate.
15881593

1589-
import importlib.util
1590-
import sys
1594+
To import a Python source file directly from a path, use the following recipe::
1595+
1596+
import importlib.util
1597+
import sys
15911598

1592-
# For illustrative purposes.
1593-
import tokenize
1594-
file_path = tokenize.__file__
1595-
module_name = tokenize.__name__
15961599

1597-
spec = importlib.util.spec_from_file_location(module_name, file_path)
1598-
module = importlib.util.module_from_spec(spec)
1599-
sys.modules[module_name] = module
1600-
spec.loader.exec_module(module)
1600+
def import_from_path(module_name, file_path):
1601+
spec = importlib.util.spec_from_file_location(module_name, file_path)
1602+
module = importlib.util.module_from_spec(spec)
1603+
sys.modules[module_name] = module
1604+
spec.loader.exec_module(module)
1605+
return module
1606+
1607+
1608+
# For illustrative purposes only (use of `json` is arbitrary).
1609+
import json
1610+
file_path = json.__file__
1611+
module_name = json.__name__
1612+
1613+
# Similar outcome as `import json`.
1614+
json = import_from_path(module_name, file_path)
16011615

16021616

16031617
Implementing lazy imports
@@ -1623,7 +1637,6 @@ The example below shows how to implement lazy imports::
16231637
False
16241638

16251639

1626-
16271640
Setting up an importer
16281641
''''''''''''''''''''''
16291642

0 commit comments

Comments
 (0)
Please sign in to comment.