일반 인수와 키워드 인수


290

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


6
: 그들은 파이썬 3 페이지에서이 물건의 일부 정리하는거야 - 당신은 또한 PEP 3102 읽어보십시오 python.org/dev/peps/pep-3102
벤 호이트

그리고 기본값이 있는지 여부는 그 값과 관련이 없습니다 (값을 전달 해야하는지 여부는 제외).
mk12


@Ben Hoyt Python 3을 다루는 아래 답변을 추가했습니다. 키워드 인수가 필요합니다
Christophe Roussy

답변:


347

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

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

다른 개념은 함수 정의 측면에 있습니다. 이름별로 매개 변수를 사용하는 함수를 정의 할 수 있으며 해당 이름을 지정할 필요조차 없습니다. 이들은 순수한 키워드 인수 이며 위치 적으로 전달 될 수 없습니다. 문법은

def my_function(arg1, arg2, **kwargs)

모든 키워드 인수를 이 함수에 통과의 이름은 사전에 배치됩니다 kwargs. 다음과 같이 런타임에이 사전의 키를 검사 할 수 있습니다.

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

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

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

5
+1 및 수락 : 당신은 두 가지 유형의 위치 + 키워드 논증에 대해 이야기 한 유일한 사람입니다. 감사!
mk12

34
말은 명확하지 않습니다. 일반적으로 호출 측의 매개 변수를 사용하는 동안 호출 측에서 인수에 대해 말합니다.
glglgl

3
매개 변수 이름 kwargs이거나 sth로 이름을 바꿀 수 있습니까? options( def my_fuction(arg1, arg2, **options)) 처럼 ?
브루스 선

1
비록 이름은 무엇이든 할 수 있습니다 kwargs협약이 더 적절한 이름이 없을 때
매트 짐머만

여기에 설명 된 두 번째 개념은 기술적으로 임의 키워드 인수라고합니다.
Anshul Dahiya '12

188

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

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'}

이러한 기능은 거의 사용되지 않지만 때로는 매우 유용하기 때문에 위치 또는 키워드가 어떤 인수인지를 아는 것이 중요합니다.


3
훌륭한 답변! 필요한 위치 인수는 이전 *positional**keywords같이 함수 정의를 변경하면 전달 될 수 있습니다 def foo(arg1, *positional, **keywords):. 여기 arg1에 위치가 필요합니다. 위치 응답은 선택적이고 가변적 인 수의 위치 인수를 의미합니다.
shaffooo

2
예, 정답입니다. 또 다른 참고 : 함수를 호출 할 경우 foo(bar=True)다음을 사용하여 값을 얻을 수 bar = keywords.pop('bar')와 동일합니다 bar = keywords.pop('bar', None). 기본값으로bar = keywords.pop('bar', False)
olibre

111

키워드 인수를 사용하는 것은 순서가 중요하지 않다는 점을 제외하고 일반 인수와 동일합니다. 예를 들어 아래의 두 함수 호출은 동일합니다.

def foo(bar, baz):
    pass

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

3
고마워 내가 할 수있는 매우 유용한 모두 의 위치 인수, 같은 키워드 인수를 지정 하고 키워드 인수로 위치 인수.
Luke Davis

47

위치 인수

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

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

키워드 인수

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

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

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

또한 기본 인수를 사용하고 키워드를 삽입하지 않으면 순서가 중요하다는 것을 알아야합니다!

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

8
IMHO, 세 번째 예 (기본 인수)는 명확하지 않습니다. 하나 이상의 매개 변수가 기본값을 선언하고 호출이 위치 표기법을 사용하지만 선언 된 매개 변수 수보다 LESS를 제공 할 때 발생하는 상황에 대해 이야기한다고 생각합니다. 그러나 예제에서 3이 선언되었고 3이 호출되었으므로 기본값은 전혀 영향을 미치지 않습니다! 3 번째 인수를 생략하려고 했습니까? 예를 들어 func("bar", 5)? 그런 다음 hello기본값 을 가져옵니다 3.
ToolmakerSteve

25

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

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

  2. 키워드로. 키워드 인수에는 키워드가 있으며 위치 인수 다음에 두 번째로 지정됩니다.

참고 것을 당신은 위치 인수를 사용하는 옵션이 있습니다.

경우 당신이 위치 인수를 사용하지 않는, 다음 - 예 - 모든 당신은 키워드 인수로 회전을 썼다.

당신이 함수를 호출하면 사용 위치 또는 키워드 또는 혼합물에 대한 결정을 내릴. 원하는 경우 모든 키워드를 수행하도록 선택할 수 있습니다. 우리 중 일부는이 선택을하지 않고 위치 주장을 사용합니다.


1
오, 나는 매개 변수에 대해 생각하고 있었는데, 실제로 그것이 인수 일 때 ( 내가 통과 한 것). 감사!
mk12

24

아무도 형식 인수를 만족하는 키 인수 매개 변수의 사전을 전달할 수 있다고 지적한 사람이 아무도 없습니다.

>>> 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
>>> 

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

1
나는 이것이 다양한 라이브러리의 소스 코드에서 발생하는 것을 보았고 너무 혼란 스러웠다. 정리해 주셔서 감사합니다!
Craig Labenz 2019

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

나를 위해 print 'a:%s, b:%s, c:%s' % (a, b, c)구문 오류가 발생하지만 print('a:%s, b:%s, c:%s' % (a, b, c))작동합니다. 파이썬 버전으로 뭔가? 어쨌든이 통찰력에 감사드립니다. 지금까지 나는 더 print('a:{}, b:{}, c:{}'.format(a, b, c))
성가신

17

Python 3 을 사용하면 필수 및 비 필수 키워드 인수를 모두 가질 수 있습니다 .


선택 사항 : (param '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'`

이것은 같은 유형 인 경우 서로 옆에 많은 비슷한 인수가있는 경우에 도움이 될 수 있습니다.이 경우 명명 된 인수를 선호하거나 인수가 함께 속한 경우 사용자 정의 클래스를 만듭니다.


3
필요한 변형은 매우 유용합니다. 기본값을 제공하지 않고 이름으로 인수를 제공하도록 권장합니다. 이는 종종 의미가 없습니다.
TNT

기본값은 멋지게 보이고 시작할 때 시간을 절약하는 데 도움이 될 수 있지만 장기적으로는 기본값이 PITA 일 수 있습니다.
Christophe Roussy

11

나는 아무도이 사용 같은 비열한 일을하는 위치 및 키워드 인수를 혼합 할 수 있다는 사실을 언급하지 않았다 놀랐어요 *args**kwargs( 이 사이트를 )

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

이를 통해 사전 정의하지 않으려는 키가있는 임의의 키워드 인수를 사용할 수 있습니다.


0

유형 주석을 사용하여 기본 kwargs가있는 예를 찾고있었습니다.

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

예:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}

0

함수를 호출 할 때 키워드로 지정되지 않은 인수기본값 을 정의하는 방법을 보완 / 추가하십시오 .

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

이 방법으로 전화하십시오 :

print(func())
print(func(my_word='love'))

당신은 얻을 것이다:

default_msg
love

에 대한 자세한 읽기 *args**kwargs파이썬에서 : https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.