Python | 함수 parameter의 순서(feat. keyword only argument)

Sua·2021년 1월 15일
3

Python

목록 보기
24/28
post-thumbnail

사전 기본개념

  • 매개변수(parameter) : 함수에 전달된 데이터를 대입하기 위한 변수, 함수 선언 시 작성
  • 인자(argument) : 함수에 전달하는 데이터 자체
  • 위치 인자(positional argument): 인자와 매개변수에 위치와 일치시키는 인자
  • 키워드 인자(keyword argument) : 매개변수에 이름으로 일치시키는 인자
  • 가변 인자(variable length positional argument) : 여러 개의 위치 인자를 받을 때 사용, 주로 *args 사용, 튜플로 받음
  • 키워드 가변 인자(variable length positional argument) : 여러 개의 키워드 인자를 받을 때 사용, 주로 **kwrags 사용, 딕셔너리로 받음
  • 매개변수 기본값(parameter default value) : 함수를 정의할때 기본값 지정, 함수를 사용할때 인자를 보내지않는다면 미리 지정한 기본값을 사용

parameter 순서(feat. keyword only argument)

함수를 정의할 때 매개변수를 어떤 형식과 순서로 지정하느냐에 따라서 함수를 호출할 때 입력하는 인자값이 달라질 수 있다. 그리고 파이썬에서 매개변수를 입력하는 순서는 정해져 있다. 바로 다음과 같다!

  • 위치 인자 - 기본값(default) 인자 - 가변 인자 - 키워드 인자 - 키워드 가변 인자

예를 들어 위 순서에 맞게 def func(a, b="Hello", *args, c, **Kwargs)라는 함수를 정의해보자.

자, 여기에서 주목해서 보아야 할 부분은 키워드 인자이다. 함수를 정의할 때는 c로 위치 인자인 a와 다를 바 없어보인다. 하지만 가변 인자인 *args 뒤에 위치해있다는 점이 중요하다. 가변 인자 뒤에 위치한 인자들은 c=value와 같이 키워드 인자로 호출해야 한다.

그냥 값만 호출하면 왜 안 되는 것일까?

안 된다. 왜냐하면 위에서 언급한 바와 같이 *arg 뒤에 위치해있기 때문이다. 가변인자 *args는 뒤에 나오는 모든 값들을 자신의 것으로 빨아들이기 때문에 c=value와 같이 키워드와 값을 묶어서 valuec의 것임을 알려주어야 한다.

가변 인자가 등장하면 나머지 인자는 키워드 인자를 통해서만 전달될 수 있다. 키워드 전용 인자이라는 의미에서 영어로는 keyword only argument라고 한다.

또한, 키워드 인자에도 기본값(default)를 지정할 수 있다. 기본값을 지정하면 함수를 호출할 때 인자를 넘겨주지 않아도 에러가 나지 않는다.

만약 기본값을 정의하지 않으면 어떤 문제가 발생할까?

기본값이 없으면 함수를 호출할 때 인자를 아예 전달하지 않거나 키워드 없이 값만 전달한다면 에러가 난다. 이를 방지하기 위해 기본값을 지정하는 것이다.

그렇다면 기본값이 없는 키워드 인자와 기본값이 있는 키워드 인자의 순서는 어떻게 해야할까?

순서는 상관없다. 왜냐하면 얘네들은 위치인자가 아니라 키워드 인자이기 때문이다. 매개변수에 기본값이 없다면 호출할 때 키워드도 명시해야 하기 때문에 구분할 수 있다.

하지만, 위치 인자의 경우는 다르다! 기본값이 있는 경우가 뒤에 나와야 한다. 기본값 매개변수가 앞에 있으면 함수를 호출할 때 어떤 매개변수를 생략한 것인지 알 수 없게 되기 때문이다.

위치 인자 자리에 키워드 인자를 사용하고 싶다면?

하지만 가변 인자 다음에 키워드 인자만 가능하다고 해서 다른 곳에서 키워드 인자를 쓰지 말라는 법은 없다. 원래 위치 인자의 자리를 /로 구분하면 앞 쪽은 위치 인자 뒤 쪽은 키워드 인자가 사용할 수 있다. 아래의 그림을 참고하면 이해가 쉬울 것이다.

예제

몇 가지 예제를 보면서 에러를 발생시키는 부분을 수정해보자.

1번

문제 코드

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
func_param_with_var_args("정우성", "01012341234", "seoul", 20)

해결 코드1

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
func_param_with_var_args("정우성", "01012341234", "seoul", age=20)
  • *args 뒤에 있는 age는 키워드 전용 인자이다. 호출 시 20 대신 age=20으로 변경하였다.

해결 코드2

def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
  • age*args 앞으로 옮겨 위치 인자로 사용했다.

2번

문제 코드

def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
 
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

해결 코드

def func_param_with_kwargs(name, age, address=0, **kwargs):
    print("name=", end=""), print(name)
    print("age=", end=""), print(age)
    print("kwargs=", end=""), print(kwargs)
    print("address=", end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
  • 키워드 가변 인자인**kwargs는 뒤에는 어떤 인자도 위치할 수 없다. 함수 정의 시 **kwargs가 맨 마지막으로 이동해야 한다.

3번

문제 코드

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=", end=""), print(name)
    print("args=", end=""), print(args)
    print("age=", end=""), print(age)
    print("kwargs=", end=""), print(kwargs)
    print("address=", end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male", mobile="01012341234", address="seoul")

해결 코드

def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("name=", end=""), print(name)
    print("args=", end=""), print(args)
    print("age=", end=""), print(age)
    print("kwargs=", end=""), print(kwargs)
    print("address=", end=""), print(address)

mixed_params(20, "정우성", "01012341234", "male", mobile="01012341234", address="seoul")
  • age를 맨 앞으로 옮겼다. (위치 인자로 사용)
  • address**kwargs 앞으로 옮겼다. (키워드 전용 인자로 사용)

참고사이트 :
Python keyword only arguments
5 Types of Arguments in Python Function Definition
TIL 3.(replit3.) 파이썬의 함수와 keyword-only arguments
Forcing the use of named parameters

profile
Leave your comfort zone

0개의 댓글