On Mon, Jan 25, 2021 at 6:39 PM Ethan Furman <et...@stoneleaf.us> wrote: > > For packages, only sub-packages are listed, not sub-modules. For > > example, ``concurrent`` package and ``concurrent.futures`` > > sub-package are listed, but not ``concurrent.futures.base`` > > sub-module. > > I'm not sure I understand the above. Is it fair to say that any stdlib > module, except > for private or test (./Lib/test/*) modules,
Private modules are listed: __future__, _abc, _aix_support, etc. > that can be imported are listed in `sys.module_names`? My confusion stems > from being able > to import `concurrent.futures` > but not `concurrent.futures.base`. For package, I chose to exclude sub-modules just to keep the list short. ~300 items can be displayed and read manually. If you want to check if "asyncio.base_events" is a stdlib module, extract "asyncio" string and check if "asyncio" is part of the list. sys.module_names cannot be used directly if you need to get the exhaustive list of all modules including sub-modules. pkgutil.iter_modules() can be used to list modules of package: >>> [mod.name for mod in pkgutil.iter_modules(path=asyncio.__path__)] ['__main__', 'base_events', 'base_futures', 'base_subprocess', 'base_tasks', 'constants', 'coroutines', 'events', 'exceptions', 'format_helpers', 'futures', 'locks', 'log', 'mixins', 'proactor_events', 'protocols', 'queues', 'runners', 'selector_events', 'sslproto', 'staggered', 'streams', 'subprocess', 'tasks', 'threads', 'transports', 'trsock', 'unix_events', 'windows_events', 'windows_utils'] One drawback is that if the stdlib would contain packages without __init__.py file, a third party project could add a sub-module to it (ex: inject encodings/myencoding.py in the encodings package). But it seems like all Lib/ sub-directories contain an __init__.py file, so it's not an issue in practice. If we include sub-modules, sys.module_names grows from 312 names to 813 names (2.6x more). Two examples: "collections", +"collections.abc", "concurrent", "concurrent.futures", +"concurrent.futures._base", +"concurrent.futures.process", +"concurrent.futures.thread", Just the encodings package contains 121 sub-modules. Victor -- Night gathers, and now my watch begins. It shall not end until my death. _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/BGC422TKT5R5HNN2A3SDDLUJE32AP5IR/ Code of Conduct: http://python.org/psf/codeofconduct/