On Tue, Jun 28, 2016 at 6:56 AM, Pavel S <pa...@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__ = ( > 'A', > 'B' > 'C', > ) > > 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__ = [] def all(thing): __all__.append(thing.__name__) return thing @all class A: pass @all class B: pass @all class C: pass @all 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. ChrisA -- https://mail.python.org/mailman/listinfo/python-list