2017-07-11 17 views
2

importを何とかオーバーライドできるので、インポートする前にモジュールでもっと洗練された操作を行うことができますか?より洗練されたモジュールインポートのために `import`をオーバーライド

例として、アプリケーションの全体的な機能にとって重要でない副機能にmatplotlibを使用する、より大きなアプリケーションがあります。 matplotlibがインストールされていない場合は、実際に何もせずに、インポートとmatplotlib関数へのすべての呼び出しが機能しているように、機能を模擬したいだけです。単純な警告は、モジュールがインストールされていないことを示すだけで、アプリケーションのコア機能を損なうことはありません。 matplotlibがインストールされていない場合は、matplotlib APIの動作を模倣した実際のモジュールではなく、MagicMockオブジェクトを返します。

したがって、import matplotlib...またはfrom matplotlib import...はすべて、対応する関数呼び出しによって自動的にオーバーライドされます。私はimportfrom ... importの式を手で置き換えることができましたが、作成したいのですが、たくさんあります。私はむしろimportを無効にすることによって、この機能を自動的に持っていたいと思います。

これは可能ですか?

答えて

1

私が見つけた最も簡単な方法は、__import__機能を独自の実装(hereと記載)に置き換えることです。誰かがmatplotlibをインポートしようとすると、次に、あなただけの代わりに別のモジュールをインポートします。

def _import(name, *args, **kwargs): 
    if name == 'matplotlib': # if someone tries to import matplotlib... 
     name = 'my_mocked_matplotlib' # ...import the mocked version instead 
    return original_import(name, *args, **kwargs) 

import builtins 
original_import = builtins.__import__ 
builtins.__import__ = _import 

わずか数のモジュールにカスタムインポート行動を制限するには、あなたが見つけるために(inspect moduleで)イントロスペクションを使用することができますどのモジュールからインポートが実行されたかを示します。

+0

いくつかのモジュールで構成される巨大なプロジェクトのように、これをグローバルに行うことはできますか? –

+0

@HendrikWieseこれはプロジェクト全体に影響するはずです。たとえば、このコードを 'a.py'に置き、' import b'を実行すると、 'b.py'はカスタムインポート関数も使用します。これはプログラム全体で共有されている 'builtinsモジュールを変更するためです。 –

+0

私は参照してください。私はそれを試してみます、ありがとう! –

0

短い答えはです。 ...しかし、モジュールがない場合はImportErrorをキャッチして、それを処理する必要があります。それ以外の場合は、すべてのインポート文を別のものに置き換えることが賢明です。

+0

これまで行ってきた方法です。すべての関連するインポート式を置き換えるのはちょっと面倒です。 –

関連する問題