Reducing import try/except boilerplate

Discussion in 'Python' started by Nick Coghlan, Dec 21, 2005.

  1. Nick Coghlan

    Nick Coghlan Guest

    Several standard library modules (e.g., cPickle/pickle, cStringIO/StringIO,
    threading/dummy_threading) have versions which may not be available on all
    platforms, and pure Python fallbacks that work on any platform Python
    supports. Flicking through the latest version of the Python Cookbook, I
    noticed many recipes that included module fallback suggestions along the lines of:

    import cPickle as pickle
    except ImportError:
    import pickle

    import threading
    except ImportError
    import dummy_threading as threading

    That seems rather verbose for something that isn't that uncommon ("these
    module all expose the same API, so just give me one of them in this order of
    preference"). So what about:

    import cPickle or pickle as pickle
    import threading or dummy_threading as threading
    # 'as' clause required since Python can't guess the name the programmer wants


    from threading or dummy_threading import Thread
    # No 'as' clause needed since the module name isn't bound

    Insomnia-induced-random-ideas-are-fun-'ly yours,
    Nick Coghlan, Dec 21, 2005
    1. Advertisements

  2. Yup. Maybe we should have BIOTW (Best Idea Of The Week) nominations.
    I'd say this is a candidate.

    The grammar for import stuff is messy though. Have you looked to see
    how this would work in? And BTW, I suppose 'or' could be an arbitrarily
    long shortcutting 'or' expression? I.e.,

    import x or y or z or etc as std_module_name
    from x or y or x or etc import std_module_name

    Anyway, +1

    Hm, not to muddle your idea with featuritis, but how about allowing
    string expressions in the place of names, differentiating between
    bare names and bare-name-expressions at the same level as import thus:

    g = 'gname'
    import g as mod # => mod = __import__('g')
    import (g) as mod # => mod = __import__('gname')

    h = ''
    import g or (h or g) or h as mod # (h or g) is a string expression => 'gname' here

    Also, a bare 'and' could make its predecessor term be treated like an ordinary expression (even if
    a bare name), allowing bare guard condition expressions, e.g.,

    import cond and name or alternate as mod # <==> import (cond and 'name') or alternate as mod

    Bengt Richter
    Bengt Richter, Dec 21, 2005
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.