##// END OF EJS Templates
Statically type OInfo. (#13973)...
Statically type OInfo. (#13973) In view of working with #13860, some cleanup inspect to be properly typed, and using stricter datastructure. Instead of dict we now use dataclasses, this will make sure that fields type and access can be stricter and verified not only at runtime, but by mypy

File last commit:

r27764:aefe51c6
r28166:29b451fc merge
Show More
module_paths.py
70 lines | 2.3 KiB | text/x-python | PythonLexer
"""Utility functions for finding modules
Utility functions for finding modules on sys.path.
"""
#-----------------------------------------------------------------------------
# Copyright (c) 2011, the IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
# Stdlib imports
import importlib
import sys
# Third-party imports
# Our own imports
#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Local utilities
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Classes and functions
#-----------------------------------------------------------------------------
def find_mod(module_name):
"""
Find module `module_name` on sys.path, and return the path to module `module_name`.
- If `module_name` refers to a module directory, then return path to __init__ file.
- If `module_name` is a directory without an __init__file, return None.
- If module is missing or does not have a `.py` or `.pyw` extension, return None.
- Note that we are not interested in running bytecode.
- Otherwise, return the fill path of the module.
Parameters
----------
module_name : str
Returns
-------
module_path : str
Path to module `module_name`, its __init__.py, or None,
depending on above conditions.
"""
spec = importlib.util.find_spec(module_name)
module_path = spec.origin
if module_path is None:
if spec.loader in sys.meta_path:
return spec.loader
return None
else:
split_path = module_path.split(".")
if split_path[-1] in ["py", "pyw"]:
return module_path
else:
return None