Reducing import try/except boilerplate

N

Nick Coghlan

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:

try:
import cPickle as pickle
except ImportError:
import pickle

try:
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

Also:

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.
 
B

Bengt Richter

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:

try:
import cPickle as pickle
except ImportError:
import pickle

try:
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

Also:

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

Regards,
Bengt Richter
 

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

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top