Python에서 * 와 ** 의 차이
*args
- 몇개의 파라미터를 받을지 모른다. 이럴 경우 args는 Tuple 형태로 전달된다.
1
2
3
4
5
6
7
8
9
10
11
12
def test(*args):
for a in args:
print(a)
test(1,2,3,4,5,6)
>>
1
2
3
4
5
6
**kwargs
- 파라미터 명을 같이 보낼 수 있다. Dictionary 형태로 전달된다.
1
2
3
4
5
6
7
8
def test2(**kwargs):
print(kwargs.keys())
print(kwargs.values())
test2(a=1,b=2,c=3)
>>>
dict_keys(['a', 'b', 'c'])
dict_values([1, 2, 3])
Trouble Shotting
Class로 정의해둔 형태를 호출해서 Dictionary
형태로 넘기고 싶었다.
1
2
3
4
class FooCreate(FooBase):
a: str
b: str
c: str
1
2
3
4
5
6
7
8
9
10
11
12
class FooDeployService:
def create_item(self, item, db):
item = FooCreate(**item)
result = FooService(db).create_item(item)
return handle_result(result)
class FooService(AppService):
def create_item(self, item: FooCreate) -> ServiceResult:
Foo_item = FooCRUD(self.db).create_item(item)
if not Foo_item:
return ServiceResult(AppException.FooCreateItem())
return ServiceResult(Foo_item)
즉, 아래와 같은 test형태로 create_item을 호출하고 싶었는데,
test -> FooDeployService -> FooService
**item이 아니라 item을 넣으니 FooCreate 클래스의 attribute 형태에 맞게 Mapping 되지 않고 에러가 발생했다. 아래와 같이 ** 형태로 넣으니 Key값을 가진 파라미터 형태로 하나씩 들어가기 때문에 에러가 나지 않고 해결되었다.
1
2
3
def test():
item = {"a": a, "b": b, "c": c}
FooDeployService().create_item(item, db)
참고 : https://sshkim.tistory.com/182