どんな構造のPythonコードをモジュール/パッケージ?
質問
を想定していますbarebones構造:
project/
main.py
providers/
__init.py__
acme1.py
acme2.py
acme3.py
acme4.py
acme5.py
acme6.py
その main.py
contains(部分):
if complexcondition():
print providers.acme5.get()
場所 __init__.py
空と acme*.py
を含む(部分):
def get():
value=complexcalculation()
return value
変更方法についてこれらのファイルに。
注意:に合わない場合は"輸入acme1","インポートacme2"な __init__.py
, があるので、めずに上場してのすべてを手にゆだねているでしょうか?
解決
この質問は、あなたの答えを持っている必要があり、Pythonモジュールのの今日、ダイナミックロードを尋ねましたます。
他のヒント
こんにちは!二年後ですが---かきほるも
ご 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]
のあいだに変更した場合、後日追加または削除す プ/acme*.py
その利用 from providers import *
に main.py
私が正しくあなたの質問を読んでいる場合は、
、それはあなたが(ヴァンゲイルが述べた問題のように)任意のダイナミックインポートをしようとしていないが、実際には、単にプロバイダパッケージ内のすべてのモジュールをインポートしようとしているように見えます。その場合は、__init__.py
にこの文を持っているのでしょう。
__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]
そして、あなたが使用するすべてのものをインポートするから...輸入*
from providers import *
、代わりにコード内で明示的にパッケージ名を使用しての、その後、あなただけのインポートされたクラスを呼び出します。
acme1.get()
acme2.get()
あなたはそれが__all__
リストを移入問題となるプロバイダパッケージに十分なモジュールを持っている場合は、、あなたはより小さなパッケージにそれらを壊すか、データにいくつかの他の方法を保存するに見てみたいことがあります。私は個人的にダイナミックインポートschennaginsと私はパッケージを再利用したいたびに対処する必要がありますする必要はありません。
所属していません StackOverflow