2017-09-16 17 views
2

にデフォルトパラメータを渡す私は機能ネストされた関数のpython

foo(x, setting1=def1, settings2=def2) 

(実際にはこれは私が唯一の1外部から設定する必要があるのデフォルトパラメータの束を持つサードパーティのライブラリ関数ですが、ためにを持っています例の...)

私は

bar(y, settings2_in=def2) 
    x = get_x(y) 
    foo(x, settings2=settings2_in) 

これはokですからこれを呼び出していますが、文体私はむしろ、パラメータに名前を呼びたいsettings2_insettings2。私が別のレイヤーを下に通し続けると、パラメータの名前を変更しなければならず、醜い状態になります。

bletch(z, settings2_in_2=def2) 
    y = get_y(z) 
    bar(y, settings2_in=settings_in_2) 

デフォルトパラメータのサブセットをこのように多くのレイヤーに渡すための「素晴らしい」/ Pythonの方法はありますか?

は私がしなければことを働かせてくれPythonのです:

bar(y, settings2=def2) 
    x = get_x(y) 
    foo(x, settings2=settings2) 

settings2の2つの用途は、文脈から異なっていること?

+0

ちょうど 'bar(y、** kwargs)'と 'foo(x、** kwargs)'だと思います。 –

+0

** kwargsはうまくやっているようです。ありがとう! –

答えて

1

あなたの質問に直接答えてください:はい、Pythonは、ローカル変数とアウトバウンド関数のパラメータを同じ名前で混同しないように賢明です。例:戻りラインにおいて

def x(a): 
    ... 

def y(a, b): 
    return x(a=a) 

、右側a関数yに渡されたパラメータと左側aからローカル変数はxを関数のパラメータです。

呼び出された関数のパラメータ名は、呼び出された関数のパラメータリストの名前空間にあります。これは、呼び出しコンテキストのローカルおよびグローバル変数とは無関係です。

+0

偉大な - 私はおそらくちょうどそれをテストしている必要がありますが、確かに知っていいですね、 –

+0

私はあなたが新しいStackOverflowユーザーであることを1ヒントを参照してください - その答えを受け入れる。 –

+0

どちらも良い答えですが、これは直接的なものです。また、ありがとう –

0

関数内のすべてのパラメータを再定義することを避けることができます。すべてのキーワード引数を取得するには、**kwargsを使用します。

def1 def2 
def1 def2 
other def2 

ノートyので、キーワードでも作品としてyを渡し、外kwargsであること:

次に、あなたのfoo機能

def foo(x, setting1="def1", settings2="def2"): 
    print(setting1,settings2) 


def bar(y,**kwargs): 
    foo(y,**kwargs) 

bar(12) 
bar(y=12) 
bar(12,setting1="other") 

結果にキーワード引数を渡します。

唯一の欠点は、実際にbarに渡すことができるものがわからないことですが、fooが受け入れることに応じて論理的です。あなたの関数にドキュメントストリングを追加して、それを確認してください。

関連する問題