2013-09-24 3 views
1

터플 뒤에 2 개의 키워드 인수를 한 번 또는 여러 번 누른 다음 다른 키워드 인수가 오는 메서드를 만들고 싶습니다. exemple 들어 :가변 길이의 인수에 대한 메서드 서명

funct(data_1, x='x_val', y='y_val', data_2, x='x_val', y='y_val', 
data_3, x='x_val', y='y_val', other_args='other_args_val') 

또는

funct(data_1, x='x_val', y='y_val', data_2, x='x_val', y='y_val', 
data_3, x='x_val', y='y_val') 

또는

funct(data_1, x='x_val', y='y_val') 

또는

funct(data_1, x='x_val', y='y_val', other_args='other_args_val') 

은 데이터 1, 데이터 2, data_3이 튜플이다 유효한 통화가 될 것입니다.

답변

3

고유해야합니다 : 당신이 볼 수 있듯이

def foo(**kwargs): 
    pass 

이 당신이 원하는 일을 못하게합니다.

foo(x=None, x=None) 
#>>> Traceback (most recent call last): 
#>>> File "<string>", line 73, in <module> 
#>>> File "/usr/lib/python3.3/ast.py", line 35, in parse 
#>>>  return compile(source, filename, mode, PyCF_ONLY_AST) 
#>>> File "<unknown>", line 4 
#>>> SyntaxError: keyword argument repeated 

유일한 선택은 새로운 입력 메커니즘을 만드는 것입니다. Veedrac에서 알 수 있듯이

funct(
    Data(data1, x="x_val", y="y_val"), 
    Data(data2, x="x_val", y="y_val"), 
    Data(data3, x="x_val", y="y_val", other_args="other_args_val") 
) 
+0

그리고 x와 y 인수와 관련된 각 튜플 인수를 갖는 다른 방법은 없을까요? – jerome

+0

이것이 내가 아는 가장 좋은 방법입니다. – Veedrac

+0

감사합니다. 명명 된 튜플로 시도해 볼게요, 그렇게해야합니다. – jerome

0

이것은 파이썬에서는 불가능합니다. 키워드 인수는 딕셔너리로 ​​전달됩니다, 그래서 당신은 키워드 인자의 수를 수용 기능을 할 수

0

당신은, 함수에 *args를 전달할 수 있지만, 대신 인수 자체는 튜플 있습니다

def funct(*args): 
    ... 

funct(
    data1, {"x": "x_val", "y": "y_val"}, 
    data2, {"x": "x_val", "y": "y_val"}, 
    data3, {"x": "x_val", "y": "y_val", "other_args": "other_args_val"} 
) 

이 또는 당신이 ( namedtuple 가능) 클래스 인스턴스를 받아 들일 수있다 : 나는 data, dictionary, data, dictionary, data, dictionary, ...을 제안한다. 당신이 인수를 반복하면 당신은 너무로 압축을 풀 수 있습니다

def func(*args): 
    for (data,x,y) in args: 
     print data,x,y 

# Pass a few tuples 
func(('cat',1,2), ('dog',3,5), ('foo',9,-1)) 

가 필요한 경우 DICT **kwargs에 배치 될 수

cat 1 2 
dog 3 5 
foo 9 -1 

패턴에 맞지 않는 다른 args

을 제공. 보다 견고한 대답은 다른 의견에 의해 제안 된대로 클래스 또는 namedtuple을 만드는 것입니다.

관련 문제