9

いくつかの異なるモジュールがあり、さまざまな状況に応じてそのうちの 1 つをインポートする必要があります。次に例を示します。

if check_situation() == 1:
    import helper_1 as helper
elif check_situation() == 2:
    import helper_2 as helper
elif ...
    ...
else:
    import helper_0 as helper

これらのヘルパーには同じ辞書が含まれていますがdict01、さまざまな状況で呼び出されるさまざまな値があります。dict02dict03

しかし、これにはいくつかの問題があります:

  1. import 文はすべてファイルの先頭に書かれていますが、check_situation()ここでの機能には前提条件が必要なため、先頭から遠く離れています。
  2. 複数のファイルがこのヘルパー モジュールを必要とするため、この種のインポートを使用するのは困難で見苦しいものです。

では、これらのヘルパーを再配置するにはどうすればよいでしょうか?

4

4 に答える 4

5

まず、インポート ステートメントをファイルの先頭に配置する必要があるという厳密な要件はありません。これは、スタイル ガイドに関するものです。

これでimportlib、 aを使用して/チェーンdictを置き換えることができます:ifelif

import importlib

d = {1: 'helper_1', 2: 'helper_2'}
helper = importlib.import_module(d.get(check_situation(), 'helper_0'))

しかし、それは本当に単なる構文上の砂糖です。揚げる魚が大きいのではないかと思います。データ構造を再考し、コードを再設計する必要があるようです。

dict01dict02のような名前の変数がある場合は常にdict03、レベルを上げて、dictsそれらのリストなどのコンテナを用意する必要があることを示しています。数字で終わる「ヘルパー」モジュール名についても同様です。

于 2013-03-13T03:06:30.163 に答える
5

を使用できます__import__()。文字列を受け取り、そのモジュールを返します。

helper=__import__("helper_{0}".format(check_situation()))

例 :

In [10]: mod=__import__("{0}math".format(raw_input("enter 'c' or '': ")))
enter 'c' or '': c             #imports cmath

In [11]: mod.__file__
Out[11]: '/usr/local/lib/python2.7/lib-dynload/cmath.so'

In [12]: mod=__import__("{0}math".format(raw_input("enter 'c' or '': ")))
enter 'c' or '': 

In [13]: mod.__file__
Out[13]: '/usr/local/lib/python2.7/lib-dynload/math.so'

@wim および python3.x ドキュメントから指摘されているように__import__():

モジュールをインポートします。この関数は Python インタープリターで使用するためのものであり、一般的な使用を意図していないため importlib.import_module()、モジュールをプログラムでインポートするために使用することをお勧めします。

于 2013-03-13T03:00:01.123 に答える
1

自分で解決してください。@MichaelScottCuthbertを参照してください。

# re_direct.py

import this_module
import that_module

wanted = None


# caller.py
import re-direct

'''
many prerequisites
'''
def imp_now(case):
    import re_direct
    if case1:
        re_direct.wanted = re_direct.this_module
    elif case2:
        re_direct.wanted = re_direct.that_module

次に、呼び出し元でそのimp_nowを呼び出すと、呼び出し元ファイルまたはこれを呼び出す他のファイルで呼び出された場合でも、すべてthis_or_that_moduleにリダイレクトされます。

また、関数にのみre_directをインポートするため、このモジュールは他の場所には表示されませんが、必要なものだけが表示されます。

于 2013-03-13T09:06:54.130 に答える
1

他の回答で与えられたアプローチは、タイトルで提起された主な質問に近いことに同意しますが、モジュールのインポートのオーバーヘッドが低く (いくつかの辞書をインポートする可能性が高いため)、インポートに副作用がない場合、この場合、それらをすべてインポートして、モジュールの後半で適切な辞書を選択する方がよい場合があります。

import helper_0
import helper_1
...
helperList = [helper_0, helper_1, helper_2...]
...
helper = helperList[check_situation()]
于 2013-03-13T03:31:24.020 に答える