これはおそらく明白な答えを持っていますが、私は初心者です。最初に「モジュール」(実際には、私が頻繁に使用する一連の機能を備えたファイル)を用意し、その最初に他のいくつかのモジュールをインポートします。ただし、私は多くのシステムで作業しているため、すべてのモジュールが特定のマシンにロードできるとは限りません。少し難しくするために、インポート時にパッケージの名前も変更します。たとえば、matplotlibはmpに短縮されます。
私がしたいことは、私が現在使用しているシステムに存在するモジュールのみをロードし、そうでないモジュールでいくつかのエラー処理を行うことです。私がそうすることを考えることができる唯一の方法は、独自のtryブロック内に各インポートステートメントを含めることです。それらをすべて同じtryブロックで囲むと、エラーをスローしたモジュールのいずれかにより、後続のモジュールが読み込まれなくなります。見栄えを良くするようなアイデアはありますか?名前を変えたくないのならとても簡単でしょう...
私は思いません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
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
最も簡単な方法は、すべてのモジュールをすべてのシステムに確実にロードできるようにすることです。それがうまくいかない場合は、各import
ステートメントをtry
ブロックで囲むことが次善の解決策であり、Pythonを使わないわけではありません。