diff --git a/lazy_loader/__init__.py b/lazy_loader/__init__.py index deea54f..8c5ca14 100644 --- a/lazy_loader/__init__.py +++ b/lazy_loader/__init__.py @@ -90,7 +90,7 @@ def __getattr__(name): raise AttributeError(f"No {package_name} attribute {name}") def __dir__(): - return __all__ + return list(__all__) if os.environ.get("EAGER_IMPORT", ""): for attr in set(attr_to_modules.keys()) | submodules: diff --git a/lazy_loader/tests/test_lazy_loader.py b/lazy_loader/tests/test_lazy_loader.py index 42d97f8..9fcc783 100644 --- a/lazy_loader/tests/test_lazy_loader.py +++ b/lazy_loader/tests/test_lazy_loader.py @@ -104,6 +104,29 @@ def test_lazy_attach(): assert locls[k] == v +def test_lazy_attach_returns_copies(): + _get, _dir, _all = lazy.attach( + __name__, ["my_submodule", "another_submodule"], {"foo": ["some_attr"]} + ) + assert _dir() is not _dir() + assert _dir() == _all + assert _dir() is not _all + + expected = ["another_submodule", "my_submodule", "some_attr"] + assert _dir() == expected + assert _all == expected + assert _dir() is not _all + + _dir().append("modify_returned_list") + assert _dir() == expected + assert _all == expected + assert _dir() is not _all + + _all.append("modify_returned_all") + assert _dir() == expected + assert _all == [*expected, "modify_returned_all"] + + def test_attach_same_module_and_attr_name(): from lazy_loader.tests import fake_pkg