2016-04-01 7 views
0

公開されたパッケージにインストールされている場合にのみ、モジュールをインポートして、適切な方法を探しています。オプションで、公開パッケージにモジュールをインポートすることはできますか?

オプションのモジュールに関するいくつかの既存の質問が二重引用符で囲まれています。 What's Python good practice for importing and offering optional features? しかし、彼らはすべてtry except ImportError:ブロックを使用して動作します。

モジュールの存在を確認するためのより良い方法(Pythonバージョン特有)に関する最近のディスカッションは、ここにあります:How to check if a python module exists without importing itこれは、チェックする良い方法を示しますが、実際の存在ではなく、ImportErrorマスキングモジュールの問題の危険にさらされます。一般的な議論は、バージョンや流通を目的としたパッケージではなく、あるバージョンまたは別のバージョンのスタンドアロンコードを中心にしているようです。

私はこれを取得2つの議論組み合わせるのであれば、:

def module_exists(module_name): 
    import sys 
    import pkgutil 
    import importlib 

    if sys.version_info < (3,0): 
     return pkgutil.find_loader(module_name) is not None 

    elif sys.version_info >= (3,0) and sys.version_info <= (3,3): 
     return importlib.find_loader(module_name) is not None 

    elif sys.version_info > (3,3): 
     return importlib.util.find_spec(module_name) is not None 

    return False 

を私の懸念は、これが壊れやすいようだということです。少なくとも私は車輪を再発明しているように。

私はちょうどtry except ImportErrorの古い答えを使用するべきですか?なぜなら、2番目のリファレンスのImportErrorの懸念とは異なり、インポート時にエラーが発生した場合でも、実際のモジュールを実際に使用することはできないからです。または、丁寧なことは、現在のモジュールの問題のためにそれを試して使用してクラッシュさせることではなく、それが存在しないふりをする(ImportError)でしょうか?

広く使用されているパッケージの1つのローカリゼーションプロファイルの下に特定のモジュールが存在する場合は、拡張機能を提供するだけです。他のローカリゼーションのユーザーには、まったく役に立たないモジュールが必要となるため、ユーザーに負担をかけたくありません。サードパーティのモジュールがなくても通常の機能は継続します。

答えて

0

使用

try: 
    import somemodule 
except ImportError: 
    # handle module not being available 

本当にImportErrorがモジュールに問題をマスクするかしないかは問題ではない - それはインポート可能だ場合にのみ気にし、それが最良のテストでインポート。

+0

本当に簡単ですか?だから私は誰かが実際にモジュールを持っているケースを無視すべきだが、それは壊れている。のように、それは彼らの問題です。私はちょうどそこにいないかのように進んでいます。 – Dethpickle

+0

私はそう思います - 壊れたモジュールを修正できないので、無視してください。さもなければ、_still_が動作しないかもしれないたくさんの複雑なコードを持つ危険があります。 – snakecharmerb

+0

いいですね。そして率直に言って、実際にはより洗練された何かよりも賢明な既存の解決策がない理由と正方形の唯一の説明が必要です。ありがとう! – Dethpickle

関連する問題