198

"키워드 인수"는 일반 인수와 어떻게 다릅니 까? 위치 구문을 사용하는 대신 모든 인수를 name=value으로 전달할 수 있습니까?파이썬 일반 인수 vs. 키워드 인수

+5

또한 PEP 3102를 읽을 수도 있습니다. Python 3에서 이러한 것들을 정리하고 있습니다. http://www.python.org/dev/peps/pep-3102/ –

+0

기본값이 없다는 것만 제외하면 (값을 전달할 필요가 있는지 여부를 제외하고), 맞습니까? – mk12

+0

[python 위치/키워드 인수] (http://symfony-world.blogspot.com/2013/07/python-positional-arguments-and-keyword.html)에 대해 자세히 알아보십시오. – ducin

답변

256

"키워드 인수"라는 두 가지 관련 개념이 있습니다.

다른 주석 작성자가 언급 한 호출 측에서는 이름으로 일부 함수 인수를 지정할 수 있습니다. 이름 (위치 인수)없이 모든 인수 뒤에 언급해야하며 언급되지 않은 매개 변수에 대한 기본값이 있어야합니다.

다른 개념은 함수 정의 측면에 있습니다. 이름으로 매개 변수를 사용하는 함수를 정의 할 수 있으며 그 이름을 지정하지 않아도됩니다. 이것들은 순수한 키워드 인수이며, 위치 적으로 전달 될 수는 없습니다. 구문은

def my_function(arg1, arg2, **kwargs) 

키워드 인수는 kwargs라는 사전에 배치됩니다. 이 같은 런타임에서이 사전의 키를 검사 할 수 있습니다 :

def my_function(**kwargs): 
    print str(kwargs) 

my_function(a=12, b="abc") 

{'a': 12, 'b': 'abc'} 
+3

+1 및 수락 : 두 가지 유형의 위치 + 키워드 인수에 대해 이야기 한 사람은 나만의 사람입니다. 다른 모든 사람들은 내가 첫 번째 또는 두 번째 이야기를하고 있다고 생각했지만 (여전히 좋은 소식이었습니다). 감사! – mk12

+17

문구가 명확하지 않은 경우 : 일반적으로 호출 된 쪽의 매개 변수는 호출하는 동안 인수를 말합니다. 유용한 기술은 – glglgl

20

함수 매개 변수에 인수 값을 할당하는 두 가지 방법이 있으며 둘 다 사용됩니다.

  1. 위치 별. 위치 인수에는 키워드가 없으며 먼저 할당됩니다.

  2. 키워드로. 키워드 인수는 키워드를 가지며 위치 인수 뒤에 두 번째로 할당됩니다. 당신이 위치 인수를 사용하는 옵션이 있습니다 것을

참고. 예 - - 당신 쓴 모든 키워드 인수로 밝혀

경우는, 위치 인수를 사용하지 않는.

함수를 호출하면 위치 또는 키워드 또는 혼합 식을 사용하기로 결정하게됩니다. 원하는 경우 모든 키워드를 수행하도록 선택할 수 있습니다. 우리 중 일부는이 선택을하지 않고 위치 적 논증을 사용합니다.

+1

오, 나는 매개 변수를 생각하고있었습니다. 실제로 그것이 무엇인지 논증이었습니다. 감사! – mk12

+2

내가 받아 들일 수 있다면 너의 것 다음이 될 것이다. – mk12

80

키워드 인수 사용은 순서가 중요하지 않은 일반적인 인수와 동일한 것입니다. 예를 들어, 두 가지 기능은 아래의 호출은 동일합니다

def foo(bar, baz): 
    pass 

foo(1, 2) 
foo(baz=2, bar=1) 
+0

감사합니다.엄밀히 말하면 ** 키워드 arg를 위치 arg, ** 및 위치 arg를 키워드 arg로 지정할 수 있습니다. –

32

위치 인수

그들은 그들 앞에 어떤 키워드가 없습니다. 순서가 중요합니다!

func(1,2,3, "foo") 

키워드 인수

그들은 앞에 키워드가. 그들은 어떤 순서로도 될 수 있습니다!

func(foo="bar", baz=5, hello=123) 

func(baz=5, foo="bar", hello=123) 

기본 인수를 사용하고 키워드 삽입을 무시하는 경우 순서가 중요하다는 점도 알아야합니다.

def test_var_kwargs(farg, **kwargs): 
    print "formal arg:", farg 
    for key in kwargs: 
     print "another keyword arg: %s: %s" % (key, kwargs[key]) 

이것은 당신이 할 수 있습니다 :

def func(foo=1, baz=2, hello=3): ... 
func("bar", 5, 123) 
+3

IMHO, 세 번째 예 (기본 인수)가 명확하지 않습니다. 하나 이상의 매개 변수가 기본값을 선언하고 호출이 위치 표기법을 사용하지만 선언 된 매개 변수의 수보다 LESS를 제공 할 때 일어나는 일에 대해 이야기하고 있다고 생각합니다. 그러나 예제에는 3이 선언되어 있고 호출에는 3이 있으므로 기본값은 아무 효과가 없습니다! 세 번째 인수는 생략 했습니까? 예 : 'func ("bar", 5)'? 그리고'hello'가 기본값 인'3'을 얻는다 고 말하십시오. – ToolmakerSteve

10

나는 아무도 당신이 *args**kwargs (from this site)를 사용하여 다음과 같이 비열한 일을하는 위치 및 키워드 인수를 혼합 할 수 있다는 사실을 언급하지 않았다 놀랐어요 사전 정의하지 않으려는 키가있을 수있는 임의의 키워드 인수를 사용하십시오.

138

구별이 중요한 마지막 언어 기능이 하나 있습니다. 다음 함수를 고려하십시오

def foo(*positional, **keywords): 
    print "Positional:", positional 
    print "Keywords:", keywords 

*positional 인수는 당신이 제공 할 수있는 얼마나 많은에 제한이없는, foo()에 전달 된 위치 인수를 모두 저장합니다.

>>> foo('one', 'two', 'three') 
Positional: ('one', 'two', 'three') 
Keywords: {} 

**keywords 인수는 키워드 인수를 저장합니다 :

>>> foo(a='one', b='two', c='three') 
Positional:() 
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'} 

물론, 당신은 두 가지를 동시에 사용할 수 있습니다 :이 기능은 거의 사용되지

>>> foo('one','two',c='three',d='four') 
Positional: ('one', 'two') 
Keywords: {'c': 'three', 'd': 'four'} 

하지만, 때로는 매우 유용하며 어떤 인수가 위치 또는 키워드인지 파악하는 것이 중요합니다.

+0

우수 답변! 'def foo (arg1, * positions, ** keywords) :'와 같은 함수 정의를 변경하면 위치 지정 인수가 필요한 위치 정보 만'* 위치 지정 '과'** 키워드'앞에 전달할 수 있습니다. 여기서'arg1'은 위치 적이며 필수적입니다. 답의 위치는 선택적이고 가변적 인 위치 인수의 수를 의미합니다. – shaffooo

18

나는 아무도 하나의 공식을 만족하는, 키 입력 인수 매개 변수의 사전을 전달할 수 있다는 지적 것 같다 것을 놀랐어요 매개 변수.

옵션 : 당신은 둘 다 필요한 키워드 arguments 비 요구 할 수 있습니다 파이썬 3를 사용

>>> def func(a='a', b='b', c='c', **kwargs): 
... print 'a:%s, b:%s, c:%s' % (a, b, c) 
... 
>>> func() 
a:a, b:b, c:c 
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'}) 
a:z, b:q, c:v 
>>> 
+9

+1입니다. 당신의 요점은'** kwargs' 없이는 더 명확해질 것입니다. 이는 고정 된 수의 매개 변수가있는 간단한 func def에서도 사전을 제공 할 수 있음을 보여줍니다. 즉, 정의에 멋진 것은 필요하지 않습니다. 그런 다음 두 번째 예제 인 WITH ** kwargs를 정의에 추가하고이를 통해 사전에 EXTRA 항목을 사용할 수있는 방법을 보여줄 수 있습니다. – ToolmakerSteve

+0

다양한 라이브러리의 소스 코드에서 이런 일이 발생하여 혼란 스러웠습니다. 그것을 정리 주셔서 감사합니다! –

+2

위의 네 번째 정규 매개 변수는 - ** kwargs는 'a', 'b'및 'c'이외의 키가 포함 된 사전으로 func을 호출하는 경우 필요합니다. – Eduardo

11

('B'에 대해 정의 된 기본 값)

def func1(a, *, b=42): 
    ... 
func1(value_for_a) # b is optional and will default to 42 

필수 ('b'에 기본값이 정의되지 않음) :

def func2(a, *, b): 
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call 
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'` 

이렇게하면 같은 유형의 여러 유사한 인수가있는 경우에 유용 할 수 있습니다.이 경우 동일한 인수가 함께 사용되는 경우 명명 된 인수를 사용하거나 사용자 정의 클래스를 만드는 것이 더 좋습니다.

+2

* 필수 * 변형은 매우 유용합니다. 디폴트를 제공하지 않고 args에 이름을 부여하는 것이 좋습니다. – TNT

+0

기본값은 멋지게 보이고 시작할 때 시간을 절약 할 수 있지만 장기적으로 기본값은 PITA가 될 수 있습니다. –