2017-12-27 32 views
0

パッケージ内のすべてのモジュールをルートレベルのメインアプリケーションからインポートし、Python 3ですぐに使用できるモジュール内の関数を持っていますか?ここでは例のファイルツリーには、次のとおりです。Python3のルートアプリケーションですぐに使用できるパッケージモジュールの機能を作成するには

+app 
    |- __init__.py 
    |- main.py 
    |+ package 
    |- __init__.py 
    |- module.py #(contains function1, function2 and function 3) 

私は(それは長くて複雑なアプリケーションのためのずさんな取得することができます)main.py内に次のimport文を避けたい:

from package.module import function1, function2, function3 

これはいいですなぜなら、それで私はfunction1()をmain.pyから呼び出すことができるからです。 package.moduleから関数をインポートするだけでは、関数の完全なディレクトリを呼び出してスクリプト内で使用する必要があります(または新しい関数内でエイリアスする)ことを意味します。

import package.module 

package.module.function(param)#not fun...too long! 

#or like this 
def newFunction(param): 
    '''why create a new function to handle an already existing one? 
     Bad form and non Pythonic''' 
    return package.module.function(param) 

私は私のパッケージの__init__.py__all__ = ["module1", "module2"]が含まれている場合、私は次の操作を実行しなければならないことを意味:たとえば

from package import * #it is said this is bad form as well 

module.function(param) 
#I just want the function and don't want to call module also 

私の目標は、パッケージやモジュールをインポートして、いっぱい持っていることです関数を使用するたびに明示的にパッケージとモジュールを呼び出す必要なく、モジュール内のすべての関数を使用することができます。

import package.module 

function1(x) 

私はdocumentation for Python 3 about modules and packagesを読んでいます。思考/助けに感謝します。

答えて

1

最良の妥協点は、インポート時に名前を変更するようだ:3つの文字を入力し

import package.module as mod 

mod.function(param) 

は十分に短くする必要があります。同時に、インポートは修飾され、*インポートとしてグローバルネームスペースを汚染しません。 modの名前は自由に使用できます。 1文字の名前でも動作します。 名前に3文字以上の文字を入れることをお勧めします。

+0

これは本当に論理的な@MikeMüllerですが、モジュールとパッケージから多くの関数をインポートすると、インポート文が指数関数的に増加する可能性があります。私は、すべての関数のインポートを処理するためのインポートスクリプトを作成し、次に試みたことはありませんが、単にメインアプリケーションから呼び出すことが可能であると思います。 50以上の輸入がある場合、非常に大きなアプリケーションはどのように処理されますか? – Fergus

+0

必要なものをインポートする必要があります。 '*'やmyメソッドを使用する場合でも、同じ量のimport文が必要です。 –

+0

もう一度@MikeMüllerに感謝します。どのように私のすべてのインポートが含まれているファイルを作成し、単に '__main __。py'アプリケーションから呼び出すことになるでしょうか?これは、メインアプリケーション内のインポートプロセスをクリーンアップするようだ。 – Fergus

関連する問題