import module from package - confusing syntax

D

David MacQuigg

I'm setting up a large hierarchy of module packages and using a
variable to select which of many alternative packages to import. For
example, the variable 'config.modsel' points to a particular "model
selector" package. 'config' is a module containing many such
variables.

My first attempt resulted in a confusing error message:

Traceback (most recent call last):
File "<pyshell#25>", line 1, in -toplevel-
from config.modsel.modelselector import ModelSelector
ImportError: No module named modsel.modelselector

It works if I enter the literal path rather than a variable:
<class libs.modsel01.modelselector.ModelSelector at 0x009F68D0>

I need to use a variable, however. The best I can come up with is:

Is this the best we can do with current Python syntax?

Should we think about suggesting a better syntax? I think the
fundamental problem is the confusion that arises from using '.' as
both a path separator and an attribute qualifier.

-- Dave
 
M

Mark McEahern

I'm setting up a large hierarchy of module packages and using a
variable to select which of many alternative packages to import.

This means you need __import__.

// m
 
D

David MacQuigg

This means you need __import__.

__import__ looks even messier than exec() We have to interpolate the
string 'config.modsel' twice.

import libs, config
config.modsel = 'modsel01'

## # What we want:
## from (config.modsel).modelselector import ModelSelector

## # Works, but messy:
## __import__('libs.%s.modelselector' % config.modsel)
## modsel = getattr(libs, config.modsel)
## ModelSelector = modsel.modelselector.ModelSelector

# Still seems like the lesser evil:
exec('from libs.%s.modelselector import ModelSelector' %
config.modsel)

The __import__ function looks like a real kludge. There is a
suggestion in section 2.1 of the Library Reference to use the 'imp'
module, and write my own import function. I guess I'll look at that
next.

-- Dave
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,731
Latest member
MarcyGipso

Latest Threads

Top