2016-04-29 11 views
1

は、だから私は方法(パイソン)

def populateGlobalList(thefile): 
    #do the stuff 
含む のmymoduleのコードで...ように、この

import mymodule 

sum_global= mymodule.populateGlobalList("bigdict.txt") 

と同じようになり、いくつかのPythonコードを持っています

これまでのところ大丈夫です。

しかし、他の場所でのmymoduleで私は理にかなって未定義sum_global、上

def usefulFunction(arg1, arg2): 
    #lotsofstuff 
    if arg1 not in sum_global: 
     #add to list 

ので、通訳の旅行を言う方法があります。今、usefulFunctionは、少なくとも理論的には、sum_globalを引数にとります。しかしsum_globalは、遭遇した単語が英語の単語(または少なくともスペルミスが正しい単語)であるかどうかを確認するために広範囲に使用される英和辞書であることを意図しています。これがたくさん起こるので、それは不必要に面倒にローカルにするように感じるでしょう。単にモジュール内のグローバルsum_globalを宣言する一方

は(基本的に通訳をだますために)、この空の容器はのmymoduleをインポートするプログラムに記入されていることを意図して、完全に間違って感じています。

このような状況に適したサウンドデザインとは何ですか?

+0

グローバルはモジュールごとに*されています*。 'sum_global'を' mymodule'に入れるか、関数の引数として渡します。 –

+0

私はそれが正確であるかどうかは分かりませんが、それをクラスにして、 'sum_global'をクラス属性にしてから、' usefulFunction'で 'self.sum_global'を参照するだけです。 – gplayer

+0

これがあなたが探していたものかどうかは不明ですが、関数defの 'kwargs'リストにオブジェクトをデフォルトとして指定すると、そのオブジェクトは一度作成された後、常にデフォルトとして提供されます。 'usefulFunction(arg1、arg2、_cached_list = {})'。 –

答えて

1

各モジュールには、独自のグローバル名前空間があります。間違ったモジュールにsum_globalを追加しました。mymoduleには存在しません。

sum_globalmymoduleに入れるか、それを必要とする関数の引数として渡します。

ファイル名がなくてもsum_globalの値を計算しないようにします。 populateGlobalList()をここでグローバルに設定することができます。これは、すべてのmymoduleである:

sum_global = None 

def populateGlobalList(filename): 
    global sum_global 
    if sum_global is None: 
     sum_global = "result of your population work" 

この関数はデータを返しません、それは(提供それがすでに設定されていない)モジュール内のグローバル変数を設定します。

しかし、は、のようなグローバルを作成しないようにしてください。

import mymodule 

sum_global = mymodule.populateGlobalList("bigdict.txt") 

result = mymodule.usefulFunction(arg1, arg2, sum_global) 

usefulFunction()を一新:あなたのモジュールのユーザーがファイル名を提供しなければならないので、ユーザーコードがpopulateGlobalList()コールと明示的の結果を追跡する場合usefulFunction() `の呼び出しにこれを渡すはるかに優れていますそのような議論を要求する。

次のステップは、このためにクラスを使用するようにモジュールに次のようになります。

class MyClass(object): 
    def __init__(self, filename): 
     self._populate() 

    def _populate(self): 
     self.sum = "result of your population work" 

    def useful_function(self, arg1, arg2): 
     # do work with self.sum 

その後、どこでも、そのクラスを使用します。

interesting_object = mymodule.MyClass('bigdict.txt') 
result = interesting_object.useful_function(arg1, arg2)