개발/Python

[파이썬] 일반 인수 vs 키워드 인수

MinorMan 2022. 10. 13. 11:07
반응형

<질문>

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


<답변1>

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

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

다른 개념은 함수 정의 측면에 있습니다. 이름으로 매개변수를 사용하는 함수를 정의할 수 있으며 해당 이름이 무엇인지 지정할 필요도 없습니다. 이것들은 순수하다키워드 인수, 위치적으로 전달할 수 없습니다. 구문은

def my_function(arg1, arg2, **kwargs)

어느키워드 인수 이 함수에 전달하면 이라는 사전에 배치됩니다.kwargs. 다음과 같이 런타임에 이 사전의 키를 검사할 수 있습니다.

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

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

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

<답변2>

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

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>

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

def foo(bar, baz):
    pass

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

<답변4>

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

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)

<답변5>

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

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

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

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

만약에당신 위치 인수를 사용하지 마십시오. 그렇다면 -- 예 -- 모든 것당신 write는 키워드 인수로 판명되었습니다.

언제당신 위치, 키워드 또는 혼합을 사용하기로 결정한 함수를 호출합니다. 원하는 경우 모든 키워드를 수행하도록 선택할 수 있습니다. 우리 중 일부는 이러한 선택을 하지 않고 위치 인수를 사용합니다.


<답변6>

나는 아무도 이렇게 형식 매개변수를 만족하는 키가 있는 인수 매개변수의 사전을 전달할 수 있다는 점을 지적하지 않은 것 같다는 사실에 놀랐습니다.

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

<답변7>

사용파이썬 3 당신은 가질 수 있습니다둘 다 필수 및 비필수 키워드arguments:

선택사항: (매개변수 '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'`

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


<답변8>

나는 아무도 위치 인수와 키워드 인수를 혼합하여 다음을 사용하여 이와 같은 교활한 일을 할 수 있다는 사실을 언급하지 않았다는 사실에 놀랐습니다.*args 그리고**kwargs (from this site):

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

이렇게 하면 미리 정의하고 싶지 않은 키가 있는 임의의 키워드 인수를 사용할 수 있습니다.


<답변9>

유형 주석을 사용하여 기본 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 {}

<답변10>

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

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

반응형