Let’s say I have the following structure:
my_module/
__init__.py
utilities.py
and __init__.py
contains
from .utilities import SomeUtilityFunction
Is there a way to prevent or alert developers when they do
from my_module.utilities import SomeUtilityFunction
instead of
from my_module import SomeUtilityFunction
The problem arose when a few modules started using a function that was imported inside a module in which it wasn’t used, while also being available on the module’s __init__.py
, so after linting the file and removing the unused import my tests started failing.
any other advice for situations like this?
That’s not correct.
__all__
is not a whitelist. It is only the list used forfrom module import *
If you have a module with submodules
foo
,bar
andbaz
and__all__ = ["foo", "bar"]
it will not prevent you from importingbaz
manually. It just won’t do it automatically.It works exactly like one. You get a warning if you try to import something not defined in it. The docs are just very confusing here ;)
Bullshit!
module/__init__.py
:__all__ = ["foo", "bar"]
module/foo.py
:def foo(): print("foo")
module/bar.py
:def bar(): print("bar")
module/baz.py
:def baz(): print("baz")
main.py
:from module import * from module import baz if __name__ == "__main__": print("main") foo.foo() bar.bar() baz.baz()
Output:
$ python main.py main foo bar baz
No errors, warnings or anything.
You’re running python without linters? Interesting approach.
@sebsch Linters aren’t runtime. Whether something will work and whether it conforms to best practice are two totally different things.
You can’t expect the user to have one.
@Chais
from module import \*
should almost never be used anyway, so…Renders correctly for me