KJH
args ??? kwargs ??? 본문
함수 인자를 받을때 *args, **kwargs 이런식으로 받는 경우를 볼 수 있다
보통 라이브러리 메서드를 타고가면 이런 케이스가 많은데 어떨때 쓰는지 보자
입력 갯수가 유동적일때 *으로 아스트리크 처럼 전부 인자로 받아주는데 가변 인자라고 하며
* 가변인자 tuple, ** 가변인자 dict 이며 때에따라 무척 편할거 같다.
인자가 몇개든 전부 받아줌
def func(*args):
print(a)
func(1)
func(1,2,3,4,5,6,7)
# result (1,)
# result (1, 2, 3, 4, 5, 6, 7)
key vaule 형태로도 가능
def func(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
func(a=1, b=2)
func(c=3, d=3)
# result
# a = 1
# b = 2
# c = 3
# d = 3
하나의 함수에서 둘 다 인자로 쓸 수 있음. 이러면 어떤 상황에서도 모든 인자를 받게됨
def func(*args, **kwargs):
print(args, kwargs)
func(1,2,3,4)
func(a=1, b=2)
func(c=3, d=3)
# (1, 2, 3, 4) {}
# () {'a': 1, 'b': 2}
# () {'c': 3, 'd': 3}
하나의 함수에서 *args, **kwargs 사이에 인자를 추가도 가능한데 새로운 인자는 강제로 사용해야 함
에러 예시
def func(*args, num,**kwargs):
print(args)
print(num)
print(kwargs)
func(1,2,3,d=4)
# Traceback (most recent call last):
# File "c:\workspaces\python\test\lam.py", line 5, in <module>
# func(1,2,3,d=4)
# TypeError: func() missing 1 required keyword-only argument: 'num'
동작 코드
def func(*args, num,**kwargs):
print(args)
print(num)
print(kwargs)
func(1,2,num=3,d=4)
# (1, 2)
# 3
# {'d': 4}
인자에는 positional argument와 keyword argument, keyword-only argument가 있는데
positional는 이름을 명시할 필요 없이 순서 위치 기준으로 입력되는 형태 - 명시해서 넣는것도 가능
keyword는 이름을 명시해줘야 함. 순서 구분 없음 - 명시하지 않고 순서대로 쓰는것도 가능
위에서 args kwargs 사이에서 사용했던 num은 keyword-only argument가 되어서 꼭 명시해줘야 하는 인자가 됨
keyword-only는 비효율적일 수 있는게 함수 안에서 assert로 따로 처리하는게 에러체킹도 수월하고 이점이 많음
※ assert 는 디버깅용으로 assert 조건, 오류메세지 이렇게 사용해서 예외처리를 간단하게 가능
def func(*args,**kwargs):
assert "num" in kwargs, "체크"
print(args)
print(kwargs)
func(1,2,3,4)
# Traceback (most recent call last):
# File "c:\workspaces\python\test\lam.py", line 5, in <module>
# func(1,2,3,4)
# File "c:\workspaces\python\test\lam.py", line 2, in func
# assert "num" in kwargs, "체크"
# ^^^^^^^^^^^^^^^
# AssertionError: 체크
'Python' 카테고리의 다른 글
GIL, ASGI, Uvicorn(/w fastapi) (0) | 2025.05.04 |
---|---|
MCP 사용해보기 (/w cursor, unity) (0) | 2025.04.06 |
lambda ??? (0) | 2024.07.29 |
Slack API (fastapi - slack_bolt) (0) | 2024.07.19 |
azure openAI (GPT4.0, ada-002) (0) | 2023.11.26 |