3

このベアボーン構造があるとします。

project/
  main.py
  providers/
    __init.py__
    acme1.py
    acme2.py
    acme3.py
    acme4.py
    acme5.py
    acme6.py

main.py(部分的に) 以下が含まれていると仮定します。

if complexcondition():
  print providers.acme5.get()

__init__.py空で含まれている場所acme*.py(部分的):

def get():
  value=complexcalculation()
  return value

これらのファイルを変更して機能させるにはどうすればよいですか?

注: 答えが「acme1 のインポート」、「acme2 のインポート」などで__init__.pyある場合、それらすべてを手動でリストせずにそれを達成する方法はありますか?

4

3 に答える 3

6

おい!2年後ですが...誰かの役に立つかもしれません

providers/__init__.pyを次のようにします。

import os
import glob

module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]

providers/acme*.pyを追加または削除する場合、後で変更する必要はありません。

次にmain.pyfrom providers import *で使用します

于 2011-02-09T10:25:23.187 に答える
5

私があなたの質問を正しく読んでいれば、動的インポートを行おうとしているのではなく (Van Gale が言及した質問のように)、実際にはプロバイダー パッケージ内のすべてのモジュールをインポートしようとしているようです。その場合は、次の__init__.pyステートメントが必要です。

__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]

次に、使用するすべてのものをインポートするには... import *

from providers import *

そして、コードでパッケージ名を明示的に使用する代わりに、インポートされたクラスを呼び出すだけです

acme1.get()
acme2.get()

プロバイダー パッケージに十分な数のモジュールがあり、__all__リストへの入力が問題になる場合は、それらを小さなパッケージに分割するか、別の方法でデータを保存することを検討してください。個人的には、パッケージを再利用するたびに動的インポート schennagins に対処する必要はありません。

于 2009-04-21T02:06:01.950 に答える
3

今日尋ねられたこの質問、Dynamic Loading of Python Modulesに答えがあるはずです。

于 2009-04-20T22:28:51.487 に答える