__all__ attribute: bug and proposal
rosuav at gmail.com
Mon Jun 27 20:32:36 EDT 2016
On Tue, Jun 28, 2016 at 6:56 AM, Pavel S <pavel at schon.cz> wrote:
> By a mistake, I forgot to put comma into '__all__' tuple of some module. Notice missing comma after 'B'.
> # module foo.py
> __all__ = (
> class A: pass
> class B: pass
> class C: pass
> If you try to import * from the module, it will raise an error, because 'B' and 'C' will be concatenated into 'BC'.
>>>> from foo import *
> AttributeError: 'module' object has no attribute 'BC'
> The bug won't be found until someone imports *.
If you're primarily worried about classes and functions, here's a neat
trick you can use:
__all__ = 
class A: pass
class B: pass
class C: pass
def d(): pass
del all # clean up the namespace (optional)
The decorator doesn't change anything (it returns its argument as-is),
but it captures the canonical name into __all__. Obviously you can't
use this if you want a non-canonical name, and you can't use it for
anything other than classes and functions (you can't decorate "pi =
3.14159"), but it might help with your actual problem.
More information about the Python-list