Be less clever with __all__ generation
Currently, in (sub)package __init__.py
files we use code like this
# Merge the public interface of all submodules.
__all__ = []
for module in ['leads', 'dispersion', 'noise', 'symmetry']:
exec('from . import {0}'.format(module))
exec('from .{0} import *'.format(module))
exec('__all__.extend({0}.__all__)'.format(module))
This is too opaque for static analysis tools for code completion and documentation retrieval, like Jedi. We should follow stdlib packages (say asyncio) and explictily write the above as.
from .leads import *
from .dispersion import *
from .noise import *
from .symmetry import *
__all__ = (leads.__all__
+ dispersion.__all__
+ noise.__all__
+ symmetry.__all__)