Home [Python] Python에서 * 와 ** 의 차이
Post
Cancel

[Python] Python에서 * 와 ** 의 차이

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

This post is licensed under CC BY 4.0 by the author.