https://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions

함수를 정의할 땐 인수는 변수,리스트,dict가 올수 있는데 순서가 중요하다.
인수의 변수는 기본값을 넣어 둘수 있는데, 호출 할때는 변수 값을 명시하지 않으면 순서대로 입력되어 호출된다.
함수 호출에서 위치 인수 위에 키워드 인수가 와야 한다.

*argeuments 는 연이은 리스트 인수값을 의미
**keywords 는 dict 값을 의미
 매개 *args 변수 뒤에 오는 모든 형식 매개변수는 ‘키워드 전용’ 인수이다.
 *args 변수 뒤에는 위치 인수로 사용 못한다.

def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])

함수를 정의할 때 매개변수를 명시적으로 표현할 수 있다.
명시적으로 표현된 경우 위치나 키워드로 선언해서 사용해야만 사용할 수 있도록 할수 있다. (안그럼 erorr 발생)

def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
      -----------    ----------     ----------
        |             |                  |
        |        Positional or keyword   |
        |                                - Keyword only
         -- Positional only

dict를 함수 매개로 선언할때 위치 인자와 이름 충돌이 있을 수 있으므로 그때 특수 매개변수를 활용한다.

def foo(name, **kwds):
    return 'name' in kwds

주로 변수 인자와 dict 인자를 같이 사용할때 잘 활용한다.

>>> foo(1, **{'name': 2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'name'

foo의 매개변수 인자 name과 dict의 key 인자 값과 겹치면 에러 발생

def foo(name, /, **kwds):
    return 'name' in kwds
 
foo(1, **{'name': 2})

이렇게 변경하여 사용


예제

def standard_arg(arg):
    print(arg)
 
def pos_only_arg(arg, /):
    print(arg)
 
def kwd_only_arg(*, arg):
    print(arg)
 
def combined_example(pos_only, /, standard, *, kwd_only):
    print(pos_only, standard, kwd_only)
>>> standard_arg(2)
2
>>> standard_arg(arg=2)
2
 
>>> pos_only_arg(1)
1
 
>>> pos_only_arg(arg=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg'
 
>>> kwd_only_arg(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given
 
>>> kwd_only_arg(arg=3)
3
 
>>> combined_example(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: combined_example() takes 2 positional arguments but 3 were given
 
>>> combined_example(1, 2, kwd_only=3)
1 2 3
 
>>> combined_example(1, standard=2, kwd_only=3)
1 2 3
 
>>> combined_example(pos_only=1, standard=2, kwd_only=3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'

← python 3.14으로