그럼 args, kwargs는 언제 쓸까?

def get_birth_year(age):
    return 2021 - age + 1

# easy solution
def print_personal_info_easy(name, height, age=None):
    print(f"name: {name}")
    print(f"height: {height}")
    if age is not None:
        birth_year = get_birth_year(age)
        print(f"birth_year: {birth_year}")

# if there are too many variables which are optional...
def print_personal_info(name, height, **kwargs):
    print(f"name: {name}")
    print(f"height: {height}")
    if "age" in kwargs:
        birth_year = get_birth_year(kwargs["age"])
        print(f"birth_year: {birth_year}")

# 보통은 args, kwargs 모두 passing하기 위해서
def print_personal_info_full(name, height, *args, **kwargs):
    print(f"name: {name}")
    print(f"height: {height}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

    if "age" in kwargs:
        birth_year = get_birth_year(kwargs["age"])
        print(f"birth_year: {birth_year}")

print_personal_info 함수의 출력과 결과는 다음과 같다.

# position args, keyword args 섞어서
print_personal_info(height=162, name="yk")
print_personal_info(height=200, name="girin", age=383)
print_personal_info("girin", height=200, age=400)
name: yk
height: 162
name: girin
height: 200
birth_year: 1639
name: girin
height: 200
birth_year: 1622

print_personal_info_full 함수의 출력과 결과는 다음과 같다.

# position args, keyword args 섞어서
print_personal_info_full("girin", 200, 2342, 23123, 34324, address="adf", age=258)
name: girin
height: 200
args: (2342, 23123, 34324)
kwargs: {'address': 'adf', 'age': 258}
birth_year: 1764

추가내용: 함수에 인자를 넣을 때, *, ** 사용해서 넣기

"""
*을 사용해 보아요
"""
print("*을 사용해 보아요")
variables = [3, 5]
# * 없이 index로 넣기
print("* 없이 index로 넣기")
print_variable_no_args(variables[0], variables[1])
# *을 사용해서 넣기
print("*을 사용해서 넣기")
print_variable_no_args(*variables)


"""
**을 사용해 보아요
"""
print("**을 사용해 보아요")
variable_dict = {"x": 3, "y": 5}
# ** 없이 dict key로 value 찾아서 넣기
print("** 없이 dict key로 value 찾아서 넣기")
print_variable_no_args(variable_dict["x"], variable_dict["y"])
# **을 사용해서 넣기
print("**을 사용해서 넣기")
print_variable_no_args(**variable_dict)

결과는 다음과 같다.

*을 사용해 보아요
* 없이 index로 넣기
x: 3
y: 5
*을 사용해서 넣기
x: 3
y: 5
**을 사용해 보아요
** 없이 dict key로 value 찾아서 넣기
x: 3
y: 5
**을 사용해서 넣기
x: 3
y: 5

args, kwargs 사용하는 최종 버전

def use_man_nai(korean_age, *args, **kwargs):
    print("use_man_nai의 args, kwargs")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")
    if korean_age:
        return 1
    else:
        return 0

def get_birth_year_full(age, *args, **kwargs):
    print("get_birth_year_full의 args, kwargs")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")
    return 2021 - age + use_man_nai(**kwargs)


def print_personal_info_master(name, height, *args, **kwargs):
    print("print_personal_info_master의 args, kwargs")

    print(f"name: {name}")
    print(f"height: {height}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

    birth_year = get_birth_year_full(**kwargs)
    print(f"birth_year: {birth_year}")
print_personal_info_master(name="yk",
                           height=162,
                           age=26,
                           korean_age=True,
                           favorite_food="Mushroom Cream Soup")

결과는 다음과 같다.

print_personal_info_master의 args, kwargs
name: yk
height: 162
args: ()
kwargs: {'age': 26, 'korean_age': True, 'favorite_food': 'Mushroom Cream Soup'}

get_birth_year_full의 args, kwargs
args: ()
kwargs: {'korean_age': True, 'favorite_food': 'Mushroom Cream Soup'}

use_man_nai의 args, kwargs
args: ()
kwargs: {'favorite_food': 'Mushroom Cream Soup'}
birth_year: 1996