web-dev-qa-db-ja.com

モジュールのインポート時のエラー処理

これはおそらく明白な答えを持っていますが、私は初心者です。最初に「モジュール」(実際には、私が頻繁に使用する一連の機能を備えたファイル)を用意し、その最初に他のいくつかのモジュールをインポートします。ただし、私は多くのシステムで作業しているため、すべてのモジュールが特定のマシンにロードできるとは限りません。少し難しくするために、インポート時にパッケージの名前も変更します。たとえば、matplotlibはmpに短縮されます。

私がしたいことは、私が現在使用しているシステムに存在するモジュールのみをロードし、そうでないモジュールでいくつかのエラー処理を行うことです。私がそうすることを考えることができる唯一の方法は、独自のtryブロック内に各インポートステートメントを含めることです。それらをすべて同じtryブロックで囲むと、エラーをスローしたモジュールのいずれかにより、後続のモジュールが読み込まれなくなります。見栄えを良くするようなアイデアはありますか?名前を変えたくないのならとても簡単でしょう...

37
Dave Schultz

私は思いませんtry exceptブロックは非Pythonicです。代わりに、Pythonでインポートを処理する一般的な方法です。

引用 Dive into Python

実際のエラー状態を処理する以外にも、例外の他の多くの用途があります。 標準の一般的な用途Pythonライブラリは、モジュールのインポートを試み、それが機能するかどうかを確認することです。存在しないモジュールをインポートするとImportError例外が発生します。これを使用して、実行時に使用可能なモジュールに基づいて複数のレベルの機能を定義したり、複数のプラットフォームをサポートしたりできます(プラットフォーム固有のコードが異なるモジュールに分離されている場合) )。

次の例は、例外を使用してプラットフォーム固有の機能をサポートする方法を示しています。

try:
    import termios, TERMIOS                     
except ImportError:
    try:
        import msvcrt                           
    except ImportError:
        try:
            from EasyDialogs import AskPassword 
        except ImportError:
            getpass = default_getpass           
        else:                                   
            getpass = AskPassword
    else:
        getpass = win_getpass
else:
    getpass = unix_getpass
48
systempuntoout

https://stackoverflow.com/a/20228312/1587329 によって提唱されているように、[@ Ianの編集により変更]

from importlib import import_module

named_libs = [('numpy', 'np'), ('matplotlib', 'mp')] # (library_name, shorthand)
for (name, short) in named_libs:
    try:
        lib = import_module(name)
    except:
        print sys.exc_info()
    else:
        globals()[short] = lib

すべてのライブラリをnamed_libsにインポートします。最初の文字列はライブラリ名、2番目の文字列は省略形です。名前のないライブラリの場合は、 元の を使用できます。

from importlib import import_module     

libnames = ['numpy', 'scipy', 'operator']
for libname in libnames:
    try:
        lib = import_module(libname)
    except:
        print sys.exc_info()
    else:
        globals()[libname] = lib
7
serv-inc

最も簡単な方法は、すべてのモジュールをすべてのシステムに確実にロードできるようにすることです。それがうまくいかない場合は、各importステートメントをtryブロックで囲むことが次善の解決策であり、Pythonを使わないわけではありません。

4
Philipp