오늘도 개발

파이썬 인수(Argument)의 종류와 규칙 본문

웹 프로그래밍/Python3

파이썬 인수(Argument)의 종류와 규칙

Sueeeeeee 2022. 6. 23. 15:15

1. 파이썬 인수의 종류

파이썬 인수는 다음과 같은 기준으로 나눌 수 있다.

 

1) 인수를 넣는 방법에 따라

- 위치 인수(positional argument) : 매개변수 위치에 맞게 순서대로 인수를 넣는 경우

- 키워드 인수(keyword argument): 순서 상관 없이 매개변수=값 형태로 인수를 넣는 경우

 

2) 인수의 개수 고정 여부에 따라

- 일반 인수(regular argument) : 함수 정의 시 인수 개수를 고정해두는 경우

- 가변 인수(variable argument) : 함수 정의 시 인수 개수를 고정해두지 않는 경우

 

3) 디폴트 값 여부에 따라

- 디폴트 값이 없는 인수(regular argument)

- 디폴트 값이 있는 인수(default value argument)

2. 파이썬 인수의 규칙

여러 종류의 인수는 섞어 쓸 수 있는데 여기에도 규칙이 있다.

그래서 함수를 정의할 때부터 매개변수를 규칙에 맞게 순서대로 작성해야 한다.

이 규칙은 다음과 같다.

def func(일반 인수, 디폴트 값이 있는 인수, *args, **kwargs):
	pass

이제 각 경우를 하나씩 살펴보자.

1. 일반 인수, 디폴트 값이 있는 인수를 같이 쓰는 경우

항상 일반 인수, 디폴트 값이 있는 인수 순으로 작성해야 한다. 

디폴트 값이 있는 인수를 생략하고 함수를 호출하는 경우

어느 인수가 어느 매개변수를 위한 것인지 모호해지므로 파이썬이 오류를 내기 때문이다.

 

순서를 반대로 넣은 코드를 살펴보자.

# 오류가 나는 함수
def first(age=20, weight):
    print(age, weight)

first(50)
# 오류 발생

 

여기서 'first(50)'은 두 가지로 해석될 수 있다.

 

1) age는 생략되었고, weight가 50이다.

2) age가 50이고 weight는 깜빡하고 안 적었다.

 

파이썬은 이게 둘 중 무슨 상황인지 판단할 길이 없다.

그래서 오류를 내고 프로그램을 중단한다.

 

이는 다음과 같이 수정할 수 있다.

def first(weight, age=20):
    print(weight, age)

first(50)
# 50 20

2. 일반 인수, 가변 위치 인수(*args)를 같이 쓰는 경우

항상 일반 인수, *args 순으로 작성해야 한다.

반대로 작성하면 어디까지가 *args를 위한 인수이고

어디까지가 일반 매개변수를 위한 인수인지 모호해지므로

파이썬이 오류를 내기 때문이다.

 

순서를 잘못 작성한 코드를 살펴보자.

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("sue", "01012341234", "seoul", 1000)

이 경우 다음과 같은 오류가 난다.

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

이 오류는 age 매개변수를 위한 인수를 찾지 못했다는 뜻이다.

파이썬이 인수 1000도 *args를 위한 인수라고 해석했기 때문이다.

 

이 경우 *args를 맨 뒤로 보내주면 오류 없이 함수를 호출할 수 있다.

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("sue", 1000, "01012341234", "seoul")

'''
name=sue
args=('01012341234', 'seoul')
age=1000
'''

3. 일반 인수, 가변 키워드 인수(**kwargs)를 같이 쓰는 경우

항상 일반 인수, **kwargs 순으로 작성해야 한다.

def func_param_with_kwargs(name, age, **kwargs):
    pass

func_param_with_kwargs("sue", "1000", mobile="01012341234", address="Mordor")

4. 디폴트 값이 있는 인수, 가변 키워드 인수(**kwargs)를 같이 쓰는 경우

항상 디폴트 값이 있는 인수, **kwargs 순으로 작성해야 한다.

2번과 비슷한 이유로 오류가 나기 때문이다. 

 

아래 잘못 작성된 코드를 보자.

파이썬은 address='Mordor'가 kwargs의 일부인지, address 매개변수의 인수인지 알 수 없으므로 오류를 낸다.

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

func_param_with_kwargs("sue", "1000", mobile="01012341234", address="Mordor")
# 오류 메시지
  File "test.py", line 1
    def func_param_with_kwargs(name, age, **kwargs, address='Shire'):
                                                    ^
SyntaxError: invalid syntax

이는 address 매개변수를 **kwargs 앞에 넣는 것으로 수정하면 해결할 수 있다.

def func_param_with_kwargs(name, age, address='Shire', **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("sue", "1000", address="Mordor", mobile="01012341234")

'''
name=sue
age=1000
kwargs={'mobile': '01012341234'}
address=Mordor
'''

5. 일반 인수, 디폴트 값이 있는 인수, *args, **kwargs를 같이 쓰는 경우

항상 일반 인수, 디폴트 값이 있는 인수, *args, **kargs 순으로 작성해야 한다.

위와 비슷한 이유 때문이다.

이 모든 인수를 섞어서 사용하면 어느 인수가 어느 매개변수를 위한 것인지 알 수 없어서 오류가 난다.

 

아래 코드는 오류가 나는 경우이다.

def mixed_params(name="noname", *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(1000, "sue", "01012341234", "happy" ,mobile="01012341234", address="Mordor")
  File "test.py", line 1
    def mixed_params(name="noname", *args, age, **kwargs, address):
                                                          ^
SyntaxError: invalid syntax

이는 다음과 같이 수정할 수 있다.

def mixed_params(age, address, name="noname", *args, **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(1000, "Mordor", "sue", "01012341234", "happy" ,mobile="01012341234")
'''
name=sue
args=('01012341234', 'happy')
age=1000
kwargs={'mobile': '01012341234'}
address=Mordor
'''