2017-12-08 9 views
1

他のサブ関数を呼び出す関数を書くとき、私は呼び出し元がそれらのサブ関数の任意のキーワード引数を渡すことを許可したいことがよくあります。しかし、私がこれを実装する現在の方法は面倒で、私はより明確で簡潔で保守可能な方法を探しています。きれいにキーワードargsを渡すには?

def foo(a, print_line="Hello World!"): 
    print a, print_line 

def bar(a, number=2, multiple=4): 
    print a, number * multiple 

def baz(a, **kwargs): 
    if "print_line" in kwargs: 
     foo(a, print_line=kwargs["print_line"]) 
    else: 
     foo(a) 

    bar_kwargs = dict() 
    if "number" in kwargs: 
     bar_kwargs["number"] = kwargs["number"] 
    if "multiple" in kwargs: 
     bar_kwargs["multiple"] = kwargs["multiple"] 
    bar(a, **bar_kwargs) 

このメソッドは、エラーが発生しやすいと私は私が表現したいすべてのkwargを実装する必要があります。以下は

は、私は現在、これを実装する方法の例です。私は時々foo(a, print_line=kwargs.get("print_line", False)で逃げることができますが、私はkwargのデフォルト引数を保持したいと思います。

答えて

0

シンプルです。ただ、具体的に、彼らが持っていることが要求される引数を定義しながら、今のサブ機能は、キーワード引数の任意の数を受け取ることができるので、これが機能するのサブ関数にkwargsから自分自身を渡すと、サブ機能

def foo(a, print_line="Hello World!", **kwargs): 
    print a, print_line 

def bar(a, number=2, multiple=4, **kwargs): 
    print a, number * multiple 

def baz(a, **kwargs): 
    foo(a, **kwargs) 
    bar(a, **kwargs) 

にkwargsから変数を追加。したがって、{'print_line':'test_line', 'number':1,'multiple':2}のようなkwarg dictは、両方の機能に対して完全に機能します。

コメントによって要求されたよう:

class SomeoneElsesClass: 
    def someone_elses_function(self, a, foo="bar"): 
    print(foo) 

class MyClass(SomeoneElsesClass): 
    def someone_elses_function(self, a, foo="bar2", **kwargs): 
    super(MyClass, self).someone_elses_function(a, foo) 
+0

感謝を!私がコントロールしていない機能(つまり、外部ライブラリから)に似たようなことをする方法がありますか? –

+0

を無効にすることができます。私は私の答えに例を追加します。 – MCBama

0

代わりの主な機能には、各サブ関数のキーワード引数を処理し、サブ機能は、そのロジック自体を処理させます。これにより、あなたのプログラムではっきりとseparate each concernが可能になります。

def foo(a, **kwargs): 
    print a, kwargs.get('print_line', 'Hello World') 

def bar(a, number=2, multiple=4): 
    print a, kwargs.get('number', 2) * kwargs.get('multiple', 4) 

def baz(a, **kwargs): 
    foo(a, **kwargs) 
    bar(a, **kwargs) 

それからだけがデフォルトとは異なる値を持つようにキーワード引数をしたい場合は、特定のキーワード引数の値を渡すために有するので、同じようbazを呼び出します。あなたの答えのための

baz('a', print_line='Hello World', number=2, multiple=4) 
# or... 
baz('a', number=2, multiple=4) 
# or... 
baz('a', print_line='Hello World') 
# or... 
baz('a') 
関連する問題