| 
6 | 6 | # The contents of this file are pickled, so don't put values in the namespace  | 
7 | 7 | # that aren't pickleable (module imports are okay, they're removed automatically).  | 
8 | 8 | 
 
  | 
9 |  | -import importlib  | 
10 | 9 | import os  | 
11 | 10 | import sys  | 
 | 11 | +from importlib import import_module  | 
 | 12 | +from importlib.util import find_spec  | 
12 | 13 | 
 
  | 
13 | 14 | # Make our custom extensions available to Sphinx  | 
14 | 15 | sys.path.append(os.path.abspath('tools/extensions'))  | 
 | 
36 | 37 |     'sphinx.ext.extlinks',  | 
37 | 38 | ]  | 
38 | 39 | 
 
  | 
39 |  | -# Skip if downstream redistributors haven't installed it  | 
40 |  | -try:  | 
41 |  | -    import sphinxext.opengraph  # noqa: F401  | 
42 |  | -except ImportError:  | 
43 |  | -    pass  | 
44 |  | -else:  | 
45 |  | -    extensions.append('sphinxext.opengraph')  | 
46 |  | - | 
 | 40 | +# Skip if downstream redistributors haven't installed them  | 
 | 41 | +_OPTIONAL_EXTENSIONS = ('sphinxext.opengraph',)  | 
 | 42 | +for optional_ext in _OPTIONAL_EXTENSIONS:  | 
 | 43 | +    try:  | 
 | 44 | +        if find_spec(optional_ext) is not None:  | 
 | 45 | +            extensions.append(optional_ext)  | 
 | 46 | +    except (ImportError, ValueError):  | 
 | 47 | +        pass  | 
 | 48 | +del _OPTIONAL_EXTENSIONS  | 
47 | 49 | 
 
  | 
48 | 50 | doctest_global_setup = '''  | 
49 | 51 | try:  | 
 | 
66 | 68 | # We look for the Include/patchlevel.h file in the current Python source tree  | 
67 | 69 | # and replace the values accordingly.  | 
68 | 70 | # See Doc/tools/extensions/patchlevel.py  | 
69 |  | -version, release = importlib.import_module('patchlevel').get_version_info()  | 
 | 71 | +version, release = import_module('patchlevel').get_version_info()  | 
70 | 72 | 
 
  | 
71 | 73 | rst_epilog = f"""  | 
72 | 74 | .. |python_version_literal| replace:: ``Python {version}``  | 
 | 
0 commit comments