generalimport icon indicating copy to clipboard operation
generalimport copied to clipboard

Allow subclassing from missing dependency

Open ZanSara opened this issue 2 years ago • 1 comments

Problem

So far generalimport does not allow users to create subclasses of missing dependencies. So this code:

generalimport("my_module")
import my_module

class SubClass(my_module.BaseClass):
    def __init__(self):
        ...

fails with:

Traceback (most recent call last):
  File "/work/generalimport/example.py", line 6, in <module>
    class SubClass(test_module.BaseClass):
  File "/work/generalimport/generalimport/fake_module.py", line 21, in error_func
    raise MissingOptionalDependency(f"Optional dependency {name} was used but it isn't installed.")
generalimport.exception.MissingOptionalDependency: Optional dependency 'test_module' was used but it isn't installed.

This is quite limiting in OOP and makes using generalimport with libraries like sqlalchemy close to impossible.

Proposed solution

I propose leveraging __mro_entries__ to make this usecase work. Classes based on non-existing modules should fail only when initialized.

PR coming soon :slightly_smiling_face:

ZanSara avatar Apr 18 '23 15:04 ZanSara

This is a really good idea, I haven't thought of this! I noticed that __init_subclass__ = error_func is the only method preventing subclassing currently.

I've never heard of __mro_entries__ before, never found it when I did my initial dunder research!

Found PEP 560 referencing it

Like I mentioned in the PR - I'd love if we could return a FakeModule object when it's subclasses

Mandera avatar Apr 19 '23 01:04 Mandera