2009-04-20 11 views
3

は、私は、このベアボーン構造を持っていると仮定しますPythonコードをモジュール/パッケージに構造化するにはどうすればよいですか?

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

(部分)main.pyが含まれているとします。

__init__.pyが空で、 acme*.pyは(部分的に)含まれている
if complexcondition(): 
    print providers.acme5.get() 

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

これらのファイルを変更するにはどうすればよいですか?

注:答えが「import acme1」、「acme2 import」などが__init__.pyにある場合は、手動で一覧表示せずに達成する方法がありますか?

+1

from providers import *を使用しています。あなたはどんな問題を抱えていますか? –

+0

重複:http://stackoverflow.com/questions/106896/how-many-python-classes-should-i-put-in-one-file; http://stackoverflow.com/questions/171785/how-do-you-organize-python-modules; http://stackoverflow.com/questions/391879/organising-my-python-project –

答えて

3

この質問は今日質問しました、Dynamic Loading of Python Modules、あなたの答えが必要です。

+0

私が望んでいたものではありませんでしたが、それは私に実行可能なソリューションに感謝しました。 – arantius

5

あなたの質問を正しく読んでいれば、(Van Galeが述べたような)動的なインポートを実行しようとしていないようですが、実際にはプロバイダのすべてのモジュールをインポートしようとしていますパッケージ。その場合は、__init__.pyであなたは、このステートメントを持ちたいでしょう:

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

次にあなたがから...輸入使用することになり、すべてをインポートする*

from providers import * 

そして代わりに、パッケージ名を使用しますあなたはそれが0123を移入問題となるプロバイダパッケージに十分なモジュールを持っている場合は、明示的にコードで、あなただけのインポートされたクラス

acme1.get() 
acme2.get() 

を呼ぶだろうリストを参照してください。小さなパッケージに分割したり、別の方法でデータを格納したりすることができます。私は個人的には、パッケージを再利用するたびに動的なschennaginsのインポートに対処する必要はありません。

6

ちょっと! 2年後にはなく...多分作るいくつかのいずれか

に参考になっ可能性があり、あなたのプロバイダような/ __ 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

は、main.py

+0

これは '魔法'を導入します。予期しない副作用が生じる。単にファイルが存在するだけでコードが実行されるべきではありません。これは、少なくとも驚きの原則に反し、これを悪い考え(tm)にします。 -1 – Ondergetekende

+0

@koko少し魔法は何が問題なのですか? :Pこのケースでは、質問は「手でそれらをすべて記載することなく、それを達成する方法はありますか?」と言っています...彼は少しの魔法を求めています。ファイルが自動的に生成され、新しいコードが表示されるたびに彼のコードを編集したくないかもしれません。どのように魔法なしでこれを達成することができましたか? – remosu

+0

あなたは正しいです、あなたのシナリオを魔法なしで達成する方法はありません。一方、このタイプの魔法は、システム管理者の地獄の始まりです(そこにいて、それを行いました)。 – Ondergetekende

関連する問題