10

ネストされた一連の try/except ステートメントではなく、次のコードを整理する方法はありますか?

try:
    import simplejson as json
except ImportError:
    try:
        import json
    except ImportError:
        try:
            from django.utils import simplejson as json
        except:
            raise "Requires either simplejson, Python 2.6 or django.utils!"
4

5 に答える 5

7

http://mail.python.org/pipermail/python-list/2007-May/441896.htmlで次の関数を見つけました。それは非常にうまく機能しているようで、そのインポートがすでに持っている既存のインポートを踏みにじることはないと確信しています。

def module_exists(module_name):
    try:
        mod = __import__(module_name)
    except ImportError:
        return False
    else:
        return True

if module_exists('simplejson'):
    import simplejson as json
elif module_exists('json'):
    import json
elif module_exists('django.utils'):
    from django.utils import simplejson as json
else:
    raise ImportError('Requires either simplejson, Python 2.6 or django.utils')

これはより多くのコードのように思えますが、これをたくさん行っている場合、関数は他の場所で再利用できます。

于 2008-12-23T07:28:56.887 に答える
4
def import_any(*mod_list):
    res = None
    for mod in mod_list:
        try:
            res = __import__(mod)
            return res
        except ImportError:
            pass
    raise ImportError("Requires one of " + ', '.join(mod_list))

json = import_any('simplejson', 'json', 'django.utils.simplejson')
于 2008-12-23T09:45:03.993 に答える
1

これを行うためのかなりの機能に感謝しますが、元の質問で説明したパターンは、この要件で最も一般的に使用されるパターンです。多くのオープンソース プロジェクトで使用されていることがわかります。

それに固執することをお勧めします。「醜い」が必ずしも「悪い」とは限らないことを忘れないでください。

于 2008-12-23T10:45:05.743 に答える