문제

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

도움이 되었습니까?

해결책

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

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

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

def my_function(arg1, arg2, **kwargs)

이 기능에 전달하는 모든 키워드 인수는 Kwargs라는 사전에 배치됩니다. 다음과 같이 런타임 에이 사전의 키를 검사 할 수 있습니다.

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

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

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

다른 팁

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

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

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

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

def foo(bar, baz):
    pass

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

위치 논쟁

그들은 앞에 키워드가 없습니다. 주문이 중요합니다!

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)

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

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

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

주목하십시오 위치 인수를 사용할 수있는 옵션이 있습니다.

만약에 위치 인수를 사용하지 마십시오. 그렇습니다. 쓴 것은 키워드 인수로 판명되었습니다.

언제 위치 또는 키워드 또는 혼합물을 사용하기로 결정한 함수를 호출하십시오. 원하는 경우 모든 키워드를 선택할 수 있습니다. 우리 중 일부는이 선택을하지 않고 위치 주장을 사용합니다.

나는 아무도 공식적인 매개 변수를 만족시키는 키 인수 매개 변수 사전을 통과 할 수 있다는 것을 아무도 지적하지 않은 것 같습니다.

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

사용 파이썬 3 요구 사항과 비 요구 사항 키워드를 모두 가질 수 있습니다 논쟁:

선택 과목: ( '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'`

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

나는 당신이 위치와 키워드 인수를 혼합하여 이와 같은 비열한 일을 할 수 있다는 사실에 대해 아무도 언급하지 않았다는 것에 놀랐습니다. *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])

이를 통해 선불을 정의하고 싶지 않은 키가있을 수있는 임의의 키워드 인수를 사용할 수 있습니다.

유형 주석을 사용하여 기본 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 {}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top