[SciPy-dev] Moving random.py
Fernando Perez
Fernando.Perez at colorado.edu
Sat Dec 17 18:33:10 EST 2005
Pearu Peterson wrote:
>>What do you think Pearu? You're probably the best one suited to make it
>>happen.
>
>
> Instead of
>
> import scipy
> scipy.import_all()
>
> we could have
>
> import scipy.import_all
>
> or similar such as `import scipy.all` etc.
>
> Though having a function import_all() would have an advantage of
> specifying packages one wishes to see in scipy namespace:
> import_all('linalg','integrate') would import only scipy.linalg and
> scipy.integrate packages and their dependencies if there are any.
>
> import_all() would import all scipy packages. Hmm, may be scipy.import_all
> should read as scipy.import and scipy.import() would be
> scipy.import('all'). However, using Python keyword `import` as a function
> name would be showstopper here, just import_all does not sound right when
> it could have optional arguments. Suggestions for better names are
> welcome.
What I don't like about having a module that magically, upon import, rebuilds
the scipy namespace, is the silent overloading of the default python semantics
for the import statement. It's one more thing to explain: 'this magic module
does this and that under the hood just from being imported, ...'.
I think that a function approach is clearer and cleaner: its docstring can
explicitly specify what it does and doesn't. Thinking of names, I also think
it's better to rename it something other than 'import*', so that we
distinguish the fact that it's more than an import statement, but rather a
namespeace loader. Here's a suggested function header (rough cut):
def mod_load(*args):
"""Load one or more modules into scipy's top-level namespace.
Usage:
This function is intended to shorten the need to import many of scipy's
submodules constantly with statements such as
import scipy.linalg, scipy.fft, scipy.etc...
Instead, you can say:
import scipy
scipy.mod_load('linalg','fft',...)
or
scipy.mod_load('all')
to load all of them in one call.
If a name which doesn't exist (except for 'all') in scipy's namespace
is
given, an exception [[WHAT? ImportError, probably?]] is raised.
Inputs:
- the names (one or more strings) of all the scipy modules one wishes to
load into the top-level namespace.
If the single argument 'all' is given, then all of scipy's subpackages are
imported.
Outputs:
The function returns a tuple with all the names of the modules which
were actually imported.
"""
And speaking of the 'all' module for interactive use, why can't we just
populate the __all__ attribute of scipy's __init__.py without performing any
actual imports? With this, a regular
from scipy import *
will work, as everything listed in __all__ will get imported, but the plain
'import scipy' will still be fast, since __all__ is just a list of strings, it
doesn't contain the actual module objects. Granted, with this you can't do
import scipy
scipy.linalg.foo()
but that's precisely why we have scipy.mod_load().
So in summary, unless I'm missing something, with:
1. mod_load as indicated above
2. __all__ properly populated
it seems to me we'd have all the desired usage cases covered, no?
Cheers,
f
More information about the SciPy-Dev
mailing list