2017-11-29 2 views
2

次のコードのようなモジュールを作成したいと思います。これらの関数は別々のファイルに格納されます。メイン関数で関数内のデータフレームへのアクセス

def function_1(arg): 
    x1, x2= arg 
    x3, x4= dataframe.loc[index, column_list] 
    d1, d2 = some computation 
    return (d1, d2) 

def function_2(arg): 
    y1, y2= arg 
    y3, y4= dataframe.loc[index, column_list] 
    d1, d2= function_1(arg) 
    return (a pair of non-linear functions) 

def function_3(dataframe): 
    data_preprocess 
    x, y = fsolve(function_2, initial_values) 
    some process 
    return (a new dataframe) 

、私はこのモジュールをインポートした後、次のようにfunction_3にデータを渡します。

dataframe=read_csv(directory) 
some data preprocess 
dataframe = function_3(dataframe) 

しかし、私は次のようなエラーメッセージが出ます:

NameError: name 'dataframe' is not defined in 'function_2' 

は以下は、私の考えです。彼らは「メイン」の「データフレーム」を参照しますので、おそらく が、助けにはなりません「function_2」と「function_1」内の「グローバル」のキーワードを使用して

  1. キーワード 'nonlocal'は、 ネストされた方法で書かれていないため、同様に役立たないでしょう。
  2. データフレームをパラメータとして追加すると、それは 'fsolve'に影響しますか?

私が間違っている場合は、親切に私を修正してください。コードをどのように変更すればよいですか?

+0

申し訳ありませんが、私は最初はあなたの質問を誤解しました。あなたは実際にあなたの推理の中でスポットを当てています。あなたは、問題#3を回避するためにあなた自身の入れ子にされた範囲を作る考え方を見逃しているだけです。回答が投稿されました。 –

+0

@MadPhysicistありがとうございました。それは非常に巧妙な考えです。 –

答えて

1

あなたの考えは正確でポイントです。あなただけのfunction3名前空間へのアクセス権を持つlambdaまたはネストされたdefのいずれかで、function2に追加の引数でthem.Passを完了し、あなたがfsolveに渡すバージョンをラップするために1つの余分のステップが必要になります。

 
... 
def function_2(dataframe, arg): 
    ... 

def function_3(dataframe): 
    # data_preprocess 
    x, y = fsolve(lambda arg: function_2(dataframe, arg), initial_values) 
    ... 

# OR 

def function_3(dataframe): 
    def fn(arg): return function_2(dataframe, arg) 
    # data_preprocess 
    x, y = fsolve(fn, initial_values) 
    ... 
関連する問題