2012-04-05 4 views
0

을 나는 명명 된 인수의 부하를받는 함수가 그래서 경우 :파이썬 명명 된 인수 자동 명명

def foo(a = 1, b = 2, c = 3, d = 4, e = 5) # etc... 
    pass 

나는 정의와 완전히 같은 이름을 가진 모든 인수로 전화 해요 :

a = 0 
b = 0 
c = 0 
d = 0 
e = 0 

이 작업을 수행하지 않으려면 어떻게해야합니까?

foo(e, b, d, a, c) 

:

foo(e = e, b = b, d = d, a = a, c = c) 

그냥 이렇게?

는 내가이 작업을 수행 할 수 있습니다 같아요

foo(a, b, c, d, e) 

하지만 인수가 이름을 복잡하게하고 내가 마음으로 그 순서를 기억할 수없는 경우

?

+0

단순히 'foo (e = 0, b = 0, d = 0, a = 0, c = 0)'가 아닌가? –

+0

왜냐하면 a, b 등등이 조건들 내에서 정의 될 수 있기 때문입니다. – Ferguzz

+1

foo를 바꿀 수 있습니까? –

답변

5

글쎄, 당신은 같은 것을 할 수있는 :

def foo(a, b, c, d): 
    print a, b, c, d 


d = 4 
b = 2 
c = 3 
a = 1 

import inspect 
foo(*[locals().get(arg, None) for arg in inspect.getargspec(foo).args]) 

을하지만 난 인수의 사전 사용하는 거라고 내가 실제로이 ... 추천 할 수 있습니다 확실하지 않다 :

foo_params = { 
    'd' : 4, 
    'b' : 2, 
    'c' : 3, 
    'a' : 1 
} 

foo(**foo_params) 

중 적은 인수를 사용하는 foo에 대한 래퍼를 작성하십시오.

+7

예, 할 수는 있지만 다른 누군가는 아마도 당신을 죽일 것입니다. –

+0

또한,'** kwargs'를 사용하는 많은 실제 함수에서 깨집니다. 덕분에 –

+0

. 나는 내가 단지 주문을 찾는 것에 달라 붙을 것이다라고 생각한다! – Ferguzz

0

는 다음과 같은 작업을 수행 할 수 있습니다

def func(a=1, b=2, c=3, **kw): 
    print a,b,c 

a = 11 
b = 22 
c = 33 

func(**locals()) 
+0

OP는 각각'foo()'(또는'func()'을 변경할 수 없습니다. –

3

파이썬의 인수 전달 메커니즘은 매우 유연합니다. 그들은 충분히 유연하지 않은 경우,이 ... 나에게 디자인 냄새처럼 보인다

  • 가능한 냄새 : 함수에 너무 많은 인수. 해결책 : 여러 함수로 나누고 사전이나 객체에서 args를 함께 전달합니다.

  • 가능한 냄새 : 나쁜 변수 이름. 해결책 : 변수에보다 설명적인 이름을 지정하십시오.

아니면 그냥 글 머리 기호를 물고 올바른 순서를 찾아서 간단하게 유지하십시오.

+0

그는 그 기능을 쓰지 않는다고 말했다. – georg

+0

@ thg435 그/그녀는 여전히'foo'의 외부 * 변수 이름을 향상시킬 수 있습니다. –

3

함수를 변경하는 것이 옵션이 아니지만 전달 된 매개 변수에 값을 할당하는 방법을 자유롭게 변경할 수있는 경우 다음은 유용한 예제 코드입니다.이것은 당신이

>>> var=dict() 
>>> var['c']=12 
>>> var['a']=10 
>>> var['b']=11 
>>> var['e']=14 
>>> foo(**var) 
a=10,b=11,c=12,d=4,e=14 

참고 할 수있는

을 감안할 때

>>> def foo(a = 1, b = 2, c = 3, d = 4, e = 5): 
    print "a={0},b={1},c={2},d={3},e={4}".format(a,b,c,d,e) 

을 preserv하는 orderdict 사용이 답변이 @ thg435에 의해 제안 된 것과 비슷하지만 당신은

    입니다
  1. inspect를 사용하여 함수가 예상하는 인수를 해킹하지 않습니다.
  2. 로컬/글로벌 사전을보고 있지 않습니다.
  3. 기본 인수 인 기본 누락 인수를 지원합니다.
  4. 물론 코스를 기억하지 않아도됩니다.
  5. 변수를 매개 변수로 전달할 필요조차 없습니다. 그냥 사전을 전달하십시오.
0

완전히 다른 인수 집합을 사용하여 5 개의 인수로 된 함수를 호출하는 것은 거의 없습니다. 실제적으로 동일한 a, c, e args를 사용하여 다른 b 및 d args (예 :)를 사용하여 호출하는 경우 다음과 같이 도와 줄 수있는 클래스를 만들 수 있습니다.

class FooWrapper(object): 
    def __init__(self, commonA, commonC, commonE): 
     self.a = commonA 
     self.c = commonC 
     self.e = commonE 

    def invokeFoo(self, _b, _d): 
     foo(a=self.a, b = _b, c = self.c, d = _d, e = self.e) 

w = FooWrapper(1, 2, 3) 
w.invokeFoo(4, 5)   # calls foo(1, 4, 2, 5, 3) 
w.invokeFoo(6, 7)   # calls foo(1, 6, 2, 7, 3) 
+2

이것은 기본적으로'functools.partial'이하는 일입니다. – georg