On Sun, Aug 02, 2020 at 03:36:44PM +0200, Sebastian M. Ernst wrote:
> Hi all,
>
> yet another (possibly bad?) idea from day-to-day work ...
>
> I occasionally need to import a lot of "stuff" from certain modules. The
> "stuff" is usually following a pattern. E.g. I have modules that
> (mostly) collect special exception classes and I usually need them all
> in one push - but nothing else from those modules.
When I have a similar requirement, I do something like this:
stuff_to_import = ['SomeError', 'AnotherError']
exec("from somemodule import %s" % ', '.join(stuff_to_import))
del stuff_to_import
(by memory, so the details may not be exactly correct).
Another possibility is to offer the stuff to import in the library
module:
# somemodule.py
errors = ['SomeError', 'AnotherError']
# caller
from somemodule import errors as errors
exec("from somemodule import %s" % ', '.join(errors))
del errors
The list of stuff to import can even be generated programmatically, by
name or functionality:
# the very end of somemodule.py
errors = [name for name, obj in globals().items()
if isinstance(obj, type) and issubclass(obj, Exception)]
Another option:
# Caller
import somemodule
globals().update({name: obj for name, obj in vars(somemodule).items()
if isinstance(obj, type) and issubclass(obj, Exception)})
The bottom line here is that we can be far more flexible about filtered
imports than mere wild cards in the names, and in a lot fewer lines of
code than you've been using.
--
Steven
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/V6J43IRZWYDM2OWOZYN3M3B2W4U62OEQ/
Code of Conduct: http://python.org/psf/codeofconduct/