import module from package - confusing syntax

Discussion in 'Python' started by David MacQuigg, Jul 3, 2004.

  1. 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:

    >>> from config.modsel.modelselector import ModelSelector


    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:

    >>> config.modsel

    <module 'libs.modsel01' ... >
    >>> from libs.modsel01.modelselector import ModelSelector
    >>> ModelSelector

    <class libs.modsel01.modelselector.ModelSelector at 0x009F68D0>

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

    >>> exec('from '+ config.modsel.__name__ +'.modelselector import ModelSelector')
    >>>


    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
     
    David MacQuigg, Jul 3, 2004
    #1
    1. Advertising

  2. On Sat, 2004-07-03 at 08:21, David MacQuigg wrote:
    > 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
     
    Mark McEahern, Jul 3, 2004
    #2
    1. Advertising

  3. On Sat, 03 Jul 2004 08:54:50 -0500, Mark McEahern
    <> wrote:

    >On Sat, 2004-07-03 at 08:21, David MacQuigg wrote:
    >> 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__.


    __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
     
    David MacQuigg, Jul 4, 2004
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page