2013-03-21 3 views
3

나는 같은 것을 할 필요가 :특별 사용은

def func1(a, *args, b="BBB", **kwargs): 
    print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs) 

그래서 다음과 같이 호출하면 것을 :

a=AAAA b=BBB args=() kwargs={'h': 'HHH', 'j': 'JJJ'} 

그러나 :

func1("AAAA", h="HHH", j="JJJ") 

출력을 생성합니다 *args 뒤에 기본 명명 된 인수를 넣을 수 없습니다. (SyntaxError: invalid syntax)

  • 왜 허용되지 않습니까?
  • 이것을 구현할 수있는 판독 가능한 방법이 있습니까? 내가 아는 유일한 방법은 b=kwargs.pop("b", "BBB")이지만이 방법은 읽기 쉽지 않습니다. 나는 그것이 속한 함수 호출 정의에 이것을 갖고 싶어한다 : 이것은 항상이 기본값이거나 사용자가 지정한 값을 갖는 매개 변수이다.

    def func1(a, b="BBB", *args, **kwargs): 
        print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs) 
    

    을하지만은이 호출 의미 :

편집

나는 args의 앞에 b을 넣을 수

func1("AAAA", "CCC", h="HHH", j="JJJ") 

를 할당 "CCC"b에, 내가 할 하지. b을 원하는 arg가 아닌 possitional arg로 지정합니다.

+2

* args 앞에 b = 'BBB'를 넣지 않는 이유는 무엇입니까? – djc

+0

제발, 제 편집 참조 – dangonfast

답변

0
def func1(a, *args, **kwargs): 
    b, k = (lambda b="BBBB", **k: b, k)(**kwargs) 
    print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, k) 

가 대안이 될 수있다.

1

In Python 2 ,

현재 파이썬 함수 호출 패러다임은 인수가 위치 또는 키워드 중 하나를 지정 될 수 있습니다. 인수는 명시 적으로 이름으로 또는 암시 적으로 위치로 채워질 수 있습니다 ( ). 결과 def func1(a, *args, b="BBB", **kwargs) 모호한 것 등

따라서 허용되지 않습니다 : 전화 func1(1, 2)에, args ==()b == 2, 또는 args = (2,)b == "BBB"해야? def func1(a, b="BBB", *args, **kwargs), 다른 한편으로는, (당신이 원하는 일을하지 않는 경우에도) 수락 이유를

이것은 : b 항상 두 번째 인수로 전달됩니다, 심지어 func1(1, c=3, b=2) 같은 호출 (이 func1(1, 2, c=3)에 해당) .

ecatmur가 지적했듯이, Python 3은 인수가 처리되는 방식을 변경하여 필요한 유연성을 제공합니다.