The lazy imports filter gets the unresolved module name for relative imports, so lazy from target import VALUE and lazy from .target import VALUE look identical to the callback even though they resolve to different modules. In this repro both filter calls print ('pkg.runner', 'target', ('VALUE',)), so the filter cannot tell the absolute and relative cases apart.
$ tmpdir=$(mktemp -d)
$ mkdir -p "$tmpdir/pkg"
$ cat > "$tmpdir/target.py" <<'PY'
VALUE = 'absolute'
PY
$ cat > "$tmpdir/pkg/__init__.py" <<'PY'
PY
$ cat > "$tmpdir/pkg/target.py" <<'PY'
VALUE = 'relative'
PY
$ cat > "$tmpdir/pkg/runner.py" <<'PY'
import sys
def my_filter(importer, name, fromlist):
print((importer, name, fromlist))
return True
sys.set_lazy_imports_filter(my_filter)
lazy from target import VALUE as absolute_value
lazy from .target import VALUE as relative_value
PY
$ PYTHONPATH="$tmpdir" ./python -c 'import pkg.runner'
('pkg.runner', 'target', ('VALUE',))
('pkg.runner', 'target', ('VALUE',))
The lazy imports filter gets the unresolved module name for relative imports, so
lazy from target import VALUEandlazy from .target import VALUElook identical to the callback even though they resolve to different modules. In this repro both filter calls print('pkg.runner', 'target', ('VALUE',)), so the filter cannot tell the absolute and relative cases apart.Linked PRs