2017-11-08 9 views
3

이것은 전통적인 * args ** kwargs 패러다임과 약간 다를 수 있습니다.두 개 또는 세 개의 매개 변수를 함수에 전달하는 방법은 무엇입니까?

필자는 세 개의 독립적 인 매개 변수를 입력으로 사용하는 수학적 기능을 가지고 있지만, 다음을 지정하여 (비 압축 적으로) 해결할 수도 있습니다. 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 

을, 나는 모든이에게, B를 지정할 수 있도록하고 싶습니다 또는 c를 선택하고 세 가지를 모두 지정할 수있는 옵션을 유지합니다. 그 일을하는 가장 Pythonic 한 방법은 무엇입니까?

+1

구별을 위해, 당신은 그들에게 어쨌든 kwargs가 필요합니다, 그렇지 않습니까? 그렇다면''kwargs' 접근 방식의 문제점은 무엇입니까? – Jeronimo

+3

그들에게'None'의 모든 디폴트 값을주고 키워드 인수로 넘깁니다. –

+0

실제 함수 블록에 관한 한,'try : [a, b, and 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