scientific-python / lazy-loader

Populate library namespace without incurring immediate import costs
BSD 3-Clause "New" or "Revised" License
118 stars 19 forks source link

Allow outside-module imports in `lazy_loader.attach_stub` #52

Open lagru opened 1 year ago

lagru commented 1 year ago

In https://github.com/scikit-image/scikit-image/pull/7007 we have run into https://github.com/scientific-python/lazy_loader/blob/2334bd279d40e0dadd3af48fe4ec494d3ce7f47d/lazy_loader/__init__.py#L204-L206

while trying to apply lazy_loader.attach_stub to skimage.morphology. That submodule tries to import and expose label from skimage.measure again as a public API function. We can workaround this by just making this import one level-deeper in a submodule, e.g. skimage.morphology._util.

However, I was wondering if this limitation is artificial and could be removed or if this constraint prevents other problems for lazy_loader.

stefanv commented 1 year ago

/cc @tlambert03

tlambert03 commented 1 year ago

if I recall correctly, that limitation was more like a NotImplementedError... I do think you'd run into NameErrors if you just naively removed the ValueError, but i think it's something that could be implemented with a little work (need to reorient myself to how that Visitor was working). I'll try to take a look soon

tlambert03 commented 1 year ago

ok, now I remember, this "within-module" limitation is actually hardcoded into the attach function itself (not just the stub loader).

https://github.com/scientific-python/lazy_loader/blob/2334bd279d40e0dadd3af48fe4ec494d3ce7f47d/lazy_loader/__init__.py#L71-L77

The lines above limit lazy_loader.attach to modules that are below whatever module attach is being used in. So, if the stub loader is to support super-module imports, the attach function would also need to be updated