-
-
Notifications
You must be signed in to change notification settings - Fork 34.2k
Open
Labels
3.15new features, bugs and security fixesnew features, bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
If setting a filter via sys.set_lazy_imports_filter(...), the filter function accepts identical inputs for absolute and relative imports, making them indistinguishable.
Code example
file: python_lazy_imports/utils_package/__init__.py
import sys
if sys.version_info >= (3, 15):
from .lazy_imports_setup import register_utils_lazy_imports_filter
register_utils_lazy_imports_filter()file: python_lazy_imports/utils_package/lazy_imports_setup.py
from __future__ import annotations
import sys
import typing
if typing.TYPE_CHECKING:
type LazyImportsFilter = typing.Callable[[str, str, tuple[str, ...] | None], bool]
def make_lazy_imports_filter_for_package(package_name: str) -> LazyImportsFilter:
print(f'make_lazy_imports_filter_for_package({package_name!r})')
def lazy_imports_filter(importer: str, name: str, fromlist: tuple[str, ...] | None) -> bool:
print(f'lazy_imports_filter({importer!r}, {name!r}, {fromlist!r})')
# Some logic here
return False
return lazy_imports_filter
def register_utils_lazy_imports_filter() -> LazyImportsFilter:
print(f'sys.set_lazy_imports({'all'!r})')
sys.set_lazy_imports('all')
new_filter = make_lazy_imports_filter_for_package('python_lazy_imports.utils_package')
print(f'sys.set_lazy_imports_filter({new_filter!r})')
sys.set_lazy_imports_filter(new_filter)
return new_filterfile: python_lazy_imports/utils_package/logging.py
blah = Nonefile: python_lazy_imports/utils_package/target_module.py
from . import logging
from .logging import blah
import logging
from logging import warningMain file
# This imports python_lazy_imports.utils_package.lazy_imports_setup first,
# then registers filter, then proceeds to importing python_lazy_imports.utils_package.target_module,
# triggering the already-registered filter from target_module
from python_lazy_imports.utils_package import target_moduleActual
Minified log
The imports above (from python_lazy_imports.utils_package.target_module) result in the following filter calls:
lazy_imports_filter('python_lazy_imports.utils_package.target_module', '', ('logging',))
lazy_imports_filter('python_lazy_imports.utils_package.target_module', 'logging', ('blah',))
lazy_imports_filter('python_lazy_imports.utils_package.target_module', 'logging', None)
lazy_imports_filter('python_lazy_imports.utils_package.target_module', 'logging', ('warning',))
Note that 1 and 2 import python_lazy_imports.utils_package.logging and 3-4 import logging
Full log
sys.set_lazy_imports('all')
make_lazy_imports_filter_for_package('python_lazy_imports.utils_package')
sys.set_lazy_imports_filter(<function make_lazy_imports_filter_for_package.<locals>.lazy_imports_filter at 0x709797053740>)
lazy_imports_filter('python_lazy_imports.utils_package.target_module', '', ('logging',))
lazy_imports_filter('python_lazy_imports.utils_package.target_module', 'logging', ('blah',))
lazy_imports_filter('python_lazy_imports.utils_package.target_module', 'logging', None)
lazy_imports_filter('logging', 'sys', None)
lazy_imports_filter('logging', 'os', None)
lazy_imports_filter('logging', 'time', None)
lazy_imports_filter('logging', 'io', None)
lazy_imports_filter('logging', 're', None)
lazy_imports_filter('re', 'enum', None)
lazy_imports_filter('enum', 'sys', None)
lazy_imports_filter('enum', 'builtins', None)
lazy_imports_filter('enum', 'types', ('MappingProxyType', 'DynamicClassAttribute'))
lazy_imports_filter('re', '', ('_compiler', '_parser'))
lazy_imports_filter('re._compiler', '_sre', None)
lazy_imports_filter('re._compiler', '', ('_parser',))
lazy_imports_filter('re._constants', '_sre', ('MAXREPEAT', 'MAXGROUPS'))
lazy_imports_filter('re._compiler', '_casefix', ('_EXTRA_CASES',))
lazy_imports_filter('re', 'functools', None)
lazy_imports_filter('re', '_sre', None)
lazy_imports_filter('re', 'copyreg', None)
lazy_imports_filter('logging', 'traceback', None)
lazy_imports_filter('traceback', 'collections.abc', None)
lazy_imports_filter('traceback', 'itertools', None)
lazy_imports_filter('traceback', 'linecache', None)
lazy_imports_filter('traceback', 'os', None)
lazy_imports_filter('traceback', 'sys', None)
lazy_imports_filter('traceback', 'textwrap', None)
lazy_imports_filter('textwrap', 're', None)
lazy_imports_filter('traceback', 'types', None)
lazy_imports_filter('traceback', 'warnings', None)
lazy_imports_filter('warnings', 'sys', None)
lazy_imports_filter('warnings', '_py_warnings', ('WarningMessage', '_DEPRECATED_MSG', '_OptionError', '_add_filter', '_deprecated', '_filters_mutated', '_filters_mutated_lock_held', '_filters_version', '_formatwarning_orig', '_formatwarnmsg', '_formatwarnmsg_impl', '_get_context', '_get_filters', '_getaction', '_getcategory', '_is_filename_to_skip', '_is_internal_filename', '_is_internal_frame', '_lock', '_new_context', '_next_external_frame', '_processoptions', '_set_context', '_set_module', '_setoption', '_setup_defaults', '_showwarning_orig', '_showwarnmsg', '_showwarnmsg_impl', '_use_context', '_warn_unawaited_coroutine', '_warnings_context', 'catch_warnings', 'defaultaction', 'deprecated', 'filters', 'filterwarnings', 'formatwarning', 'onceregistry', 'resetwarnings', 'showwarning', 'simplefilter', 'warn', 'warn_explicit'))
lazy_imports_filter('_py_warnings', 'sys', None)
lazy_imports_filter('_py_warnings', '_contextvars', None)
lazy_imports_filter('_py_warnings', '_thread', None)
lazy_imports_filter('traceback', 'codeop', None)
lazy_imports_filter('codeop', '__future__', None)
lazy_imports_filter('codeop', 'warnings', None)
lazy_imports_filter('traceback', 'keyword', None)
lazy_imports_filter('traceback', 'tokenize', None)
lazy_imports_filter('tokenize', 'builtins', ('open',))
lazy_imports_filter('tokenize', 'codecs', ('lookup', 'BOM_UTF8'))
lazy_imports_filter('tokenize', 'collections', None)
lazy_imports_filter('tokenize', 'functools', None)
lazy_imports_filter('tokenize', 'io', ('TextIOWrapper',))
lazy_imports_filter('tokenize', 'itertools', None)
lazy_imports_filter('tokenize', 're', None)
lazy_imports_filter('tokenize', 'sys', None)
lazy_imports_filter('tokenize', 'token', ('EXACT_TOKEN_TYPES',))
lazy_imports_filter('tokenize', '_tokenize', None)
lazy_imports_filter('tokenize', 'token', None)
lazy_imports_filter('traceback', 'io', None)
lazy_imports_filter('traceback', 'importlib.util', None)
lazy_imports_filter('traceback', 'pathlib', None)
lazy_imports_filter('pathlib', 'io', None)
lazy_imports_filter('pathlib', 'ntpath', None)
lazy_imports_filter('ntpath', 'os', None)
lazy_imports_filter('ntpath', 'sys', None)
lazy_imports_filter('ntpath', 'genericpath', None)
lazy_imports_filter('pathlib', 'operator', None)
lazy_imports_filter('pathlib', 'os', None)
lazy_imports_filter('pathlib', 'posixpath', None)
lazy_imports_filter('pathlib', 'sys', None)
lazy_imports_filter('pathlib', 'glob', ('_StringGlobber', '_no_recurse_symlinks'))
lazy_imports_filter('glob', 'contextlib', None)
lazy_imports_filter('contextlib', 'abc', None)
lazy_imports_filter('contextlib', 'os', None)
lazy_imports_filter('contextlib', 'sys', None)
lazy_imports_filter('contextlib', '_collections_abc', None)
lazy_imports_filter('contextlib', 'collections', ('deque',))
lazy_imports_filter('contextlib', 'functools', ('wraps',))
lazy_imports_filter('contextlib', 'types', ('GenericAlias',))
lazy_imports_filter('glob', 'os', None)
lazy_imports_filter('glob', 're', None)
lazy_imports_filter('glob', 'fnmatch', None)
lazy_imports_filter('fnmatch', 'functools', None)
lazy_imports_filter('fnmatch', 'itertools', None)
lazy_imports_filter('fnmatch', 'os', None)
lazy_imports_filter('fnmatch', 'posixpath', None)
lazy_imports_filter('fnmatch', 're', None)
lazy_imports_filter('glob', 'functools', None)
lazy_imports_filter('glob', 'itertools', None)
lazy_imports_filter('glob', 'operator', None)
lazy_imports_filter('glob', 'stat', None)
lazy_imports_filter('glob', 'sys', None)
lazy_imports_filter('pathlib', 'itertools', ('chain',))
lazy_imports_filter('pathlib', 'stat', ('S_IMODE', 'S_ISDIR', 'S_ISREG', 'S_ISLNK', 'S_ISSOCK', 'S_ISBLK', 'S_ISCHR', 'S_ISFIFO'))
lazy_imports_filter('pathlib', '_collections_abc', ('Sequence',))
lazy_imports_filter('pathlib', 'pathlib._os', ('vfsopen', 'vfspath', 'ensure_different_files', 'ensure_distinct_paths', 'copyfile2', 'copyfileobj'))
lazy_imports_filter('pathlib._os', 'io', ('TextIOWrapper', 'text_encoding'))
lazy_imports_filter('pathlib._os', 'os', None)
lazy_imports_filter('pathlib._os', 'sys', None)
lazy_imports_filter('traceback', '_colorize', None)
lazy_imports_filter('_colorize', 'os', None)
lazy_imports_filter('_colorize', 'sys', None)
lazy_imports_filter('_colorize', 'collections.abc', ('Callable', 'Iterator', 'Mapping'))
lazy_imports_filter('_colorize', 'dataclasses', ('dataclass', 'field', 'Field'))
lazy_imports_filter('dataclasses', 're', None)
lazy_imports_filter('dataclasses', 'sys', None)
lazy_imports_filter('dataclasses', 'copy', None)
lazy_imports_filter('copy', 'types', None)
lazy_imports_filter('copy', 'weakref', None)
lazy_imports_filter('weakref', '_weakref', ('getweakrefcount', 'getweakrefs', 'ref', 'proxy', 'CallableProxyType', 'ProxyType', 'ReferenceType', '_remove_dead_weakref'))
lazy_imports_filter('weakref', '_weakrefset', ('WeakSet',))
lazy_imports_filter('_weakrefset', '_weakref', ('ref',))
lazy_imports_filter('_weakrefset', 'types', ('GenericAlias',))
lazy_imports_filter('weakref', '_collections_abc', None)
lazy_imports_filter('weakref', 'sys', None)
lazy_imports_filter('weakref', 'itertools', None)
lazy_imports_filter('copy', 'copyreg', ('dispatch_table',))
lazy_imports_filter('dataclasses', 'types', None)
lazy_imports_filter('dataclasses', 'inspect', None)
lazy_imports_filter('inspect', 'abc', None)
lazy_imports_filter('inspect', 'annotationlib', ('Format', 'ForwardRef'))
lazy_imports_filter('annotationlib', 'ast', None)
lazy_imports_filter('annotationlib', 'builtins', None)
lazy_imports_filter('annotationlib', 'enum', None)
lazy_imports_filter('annotationlib', 'keyword', None)
lazy_imports_filter('annotationlib', 'sys', None)
lazy_imports_filter('annotationlib', 'types', None)
lazy_imports_filter('inspect', 'annotationlib', ('get_annotations',))
lazy_imports_filter('inspect', 'ast', None)
lazy_imports_filter('inspect', 'dis', None)
lazy_imports_filter('dis', 'sys', None)
lazy_imports_filter('dis', 'types', None)
lazy_imports_filter('dis', 'collections', None)
lazy_imports_filter('dis', 'io', None)
lazy_imports_filter('opcode', 'builtins', None)
lazy_imports_filter('opcode', '_opcode', None)
lazy_imports_filter('opcode', '_opcode', ('stack_effect',))
lazy_imports_filter('opcode', '_opcode_metadata', ('_specializations', '_specialized_opmap', 'opmap', 'HAVE_ARGUMENT', 'MIN_INSTRUMENTED_OPCODE'))
lazy_imports_filter('dis', 'opcode', ('__all__', '_cache_format', '_inline_cache_entries', '_nb_ops', '_common_constants', '_intrinsic_1_descs', '_intrinsic_2_descs', '_special_method_names', '_specializations', '_specialized_opmap'))
lazy_imports_filter('dis', '_opcode', ('get_executor',))
lazy_imports_filter('inspect', 'collections.abc', None)
lazy_imports_filter('inspect', 'enum', None)
lazy_imports_filter('inspect', 'importlib.machinery', None)
lazy_imports_filter('inspect', 'itertools', None)
lazy_imports_filter('inspect', 'linecache', None)
lazy_imports_filter('inspect', 'os', None)
lazy_imports_filter('inspect', 're', None)
lazy_imports_filter('inspect', 'sys', None)
lazy_imports_filter('inspect', 'tokenize', None)
lazy_imports_filter('inspect', 'token', None)
lazy_imports_filter('inspect', 'types', None)
lazy_imports_filter('inspect', 'functools', None)
lazy_imports_filter('inspect', 'builtins', None)
lazy_imports_filter('inspect', 'keyword', ('iskeyword',))
lazy_imports_filter('inspect', 'operator', ('attrgetter',))
lazy_imports_filter('inspect', 'collections', ('namedtuple', 'OrderedDict'))
lazy_imports_filter('inspect', '_weakref', ('ref',))
lazy_imports_filter('dataclasses', 'keyword', None)
lazy_imports_filter('dataclasses', 'itertools', None)
lazy_imports_filter('dataclasses', 'annotationlib', None)
lazy_imports_filter('dataclasses', 'abc', None)
lazy_imports_filter('dataclasses', 'reprlib', ('recursive_repr',))
lazy_imports_filter('traceback', 'contextlib', ('suppress',))
lazy_imports_filter('logging', 'warnings', None)
lazy_imports_filter('logging', 'weakref', None)
lazy_imports_filter('logging', 'collections.abc', None)
lazy_imports_filter('logging', 'types', ('GenericAlias',))
lazy_imports_filter('logging', 'string', ('Template',))
lazy_imports_filter('string', '_string', None)
lazy_imports_filter('logging', 'string', ('Formatter',))
lazy_imports_filter('logging', 'threading', None)
lazy_imports_filter('threading', 'os', None)
lazy_imports_filter('threading', 'sys', None)
lazy_imports_filter('threading', '_thread', None)
lazy_imports_filter('threading', '_contextvars', None)
lazy_imports_filter('threading', 'time', ('monotonic',))
lazy_imports_filter('threading', '_weakrefset', ('WeakSet',))
lazy_imports_filter('threading', 'itertools', ('count',))
lazy_imports_filter('threading', '_thread', ('stack_size',))
lazy_imports_filter('logging', 'atexit', None)
lazy_imports_filter('python_lazy_imports.utils_package.target_module', 'logging', ('warning',))
Meta
- Python 3.15.0a7 (main, Mar 11 2026, 09:26:00) [GCC 13.3.0] on linux
- Ubuntu 24.04.4 LTS
CPython versions tested on:
3.15
Operating systems tested on:
Linux
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
3.15new features, bugs and security fixesnew features, bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error