2017-11-08 15 views
3

これは多分より少し異なっているだけで、従来の*引数** kwargsからパラダイム:2つまたは3つのパラメータを関数に渡すにはどうすればよいですか?

しかし私は、入力として、三つの独立したパラメータを取り数学関数は、それも指定することにより、(非コンパクトに)解くことができる持っています3つのうちのいずれか2つ。

現在、私はオプションの制約として、Cとのaとbに厳密に基づいて、非コンパクトなソリューションを、持っている:

def func(a,b,c=None): 
    if c is not None: 
    # do something with a, b, and c 
    else: 
    # do something with only a, b 
    return result 

しかし、私は、任意の2を指定できるようにしたいと思い、B 、またはcを指定し、3つすべてを指定するオプションを保持します。それを行う最もPythonの方法は何ですか?

+1

区別のために、あなたはそれらをクワルガーにする必要がありますね。では、 '' kwargs''アプローチの何が問題になりますか? – Jeronimo

+3

すべてのデフォルト値に 'None'を与え、それをキーワード引数として渡します。 –

+0

あなたの実際の関数ブロックに関する限り、 'try:[a、b、およびcで何かをしてください]を実行し、次にexceptブロックで何が例外がスローされたかを見て、そこ。 – Acccumulation

答えて

3

あなたはちょうどそのキーワード引数として引数を渡す、彼らにNoneのすべてのデフォルト値を与えることができます:

def foo(a=None, b=None, c=None): 
    print(a, b, c) 

foo(a=123, b=456) 
foo(a=123, c=789) 
foo(b=456, c=789) 

この例では、生成します。

123 456 None 
123 None 789 
None 456 789 
0

代替アプローチを:

def func(**kwargs): 
    p_keys = kwargs.keys() 
    if 'a' in p_keys and 'b' in p_keys: 
     # non-compact solution 
     if 'c' in p_keys: 
      # apply optional constraint 
    elif set(p_keys).issubset({'a', 'b', 'c'}): 
     # apply solution for 'any two' 
    else: 
     #complain loudly 
     pass 
    return 
関連する問題