인공지능을 좋아하는 곧미남

Packing, Unpacking 본문

code_study/python 내장함수

Packing, Unpacking

곧미남 2022. 1. 17. 15:59

함수나 클래스가 받은 여러개의 인자들을 하나의 객체로 관리 시키는것이 "Packing" 입니다.

 

"Packing"에는 두 가지 방법이 있습니다. 인자를 "Packing"하는 방법과 키워드를 "Packing"하는 방법입니다.

 

그 반대로 여러개의 인자들을 포함하고 있는 하나의 객체를 풀어주는 것이 "Unpacking"입니다.

 

마찬가지로 "Unpacking"에도 두 가지 방법이 있습니다. 인자를 "Unpacking"하는 방법과 키워드를 "Unpacking"하는 방법입니다.

 

오늘의 내용은 아래 목차와 같습니다.

 

< INDEX >

 

1. 인자를 "Packing"하는 방법

 

2. 키워드를 "Packing"하는 방법

 

3. 인자를 "Unpacking"하는 방법

 

4. 키워드를 "Unpacking"하는 방법

 

5. 고찰 및 딥러닝 모델 구축에 활용


1. 인자를 "Packing"하는 방법

     - 인자를 Packing 하는 방법은 *를 함수나 클래스에서 전달받는 변수를 선언할때 변수 앞에 붙여주면 됩니다.

    - 저 func 메서드와 B 클래스의 변수를 *parameters로 선언해놓고 여러인자 (b ,c, d)를 전달하면 3가지 원소를 가진 하나의 tuple 객체(1, 62, 'c')가 생성된다.

2. 키워드를 "Packing"하는 방법

     - 인자를 Packing 하는 방법은 **를 함수나 클래스에서 전달받는 변수를 선언할때 변수 앞에 붙여주면 됩니다.

3. 인자를 "Unpacking"하는 방법

     - 인자를 Unpacking 하는 방법은 *를 메서드나 클래스에 전달할 변수 앞에 붙여주면 됩니다.

4. 키워드를 "Unpacking"하는 방법

     - 인자를 Unpacking 하는 방법은 **를 메서드나 클래스에서 전달받는 변수를 선언할때 변수 앞에 붙여주면 됩니다.

alpabat = {
    'first' : "a",
    'second' : "b",
    "third" : "c",
    "fth" : "d"
}

def unpacking(first, second, third, fth):
    print(first)
    print(type(first))
    print(second)
    print(type(second))
    print(third)
    print(type(third))
    print(fth)
    print(type(fth))

class A:
    def __init__(self, first, second, third, fth):
        self.first = first
        self.second = second
        self.third = third
        self.fth = fth

    def tell(self):
        print(self.first)
        print(type(self.first))
        print(self.second)
        print(type(self.second))
        print(self.third)
        print(type(self.third))
        print(self.fth)
        print(type(self.fth))


print(f"지금은 모두 packing되어 있다! 이렇게: {alpabat}")
# 하지만 *alpabat을 통해 list 원소를 순차적으로 Unpacking한다!
print("메서드 출력")
unpacking(**alpabat)
print("클래스 출력")
a = A(**alpabat)
a.tell()

- 키워드를 "Unpacking" 할때는 전달하는 Dict의 "Key" 변수와 클래스나 메서드에서 정의한 변수의 이름을 같게해야합니다! 그래야 작동합니다. alpabat의 key 값인 first, second, third, fth를 메서드와 클래스 변수명과 일치 필요!

alpabat = {
    'first' : "a",
    'second' : "b",
    "third" : "c",
    "fth" : "d"
}


def unpacking(first, second, third, fth):

class A:
    def __init__(self, first, second, third, fth):

5. 고찰 및 딥러닝 모델 구축에 활용

"Packing"이나 "Unpacking"을 나누는 기준은 *, ** 기호를 어느 파라미터 앞에 붙이는 위치를 확인하시면 됩니다.

 

그리고 인자를 다룰지 키워드를 다룰지는 * 기호 하나를 사용하면 인자, ** 기호 두개를 사용하면 키워드라고 생각하시면 좀 더 쉽게 이해할 수 있습니다. 

 

특이사항으로, 키워드를 "Unpacking" 할때는 전달하는 Dict의 "Key" 변수와 클래스나 메서드에서 정의한 변수의 이름을 같게해야합니다! 그래야 작동합니다.

 

한편으로는 딥러닝 BackBone 모델인 resnet을 구현할때 torchvision api 코드는 unpacking을 사용하여 layer의 구성을 시퀀스화 하였습니다.

 

해당 코드를 보시면, nn.Sequential(*layers)를 선언함으로서 layers list에 속한 원소 하나하나를 순서대로 "Unpacking"하여 시퀀스 layer를 구축합니다!

 

읽어 주셔서 감사합니다.

Comments