파이썬3 노트

모듈/함수 공부: [typing] [@property] [[int, ...]]

Jonchann 2018. 6. 13. 23:07

현재 연구실에서 참가하고 있는(강제 참가) 공부회에서 내 준 과제가 numpy를 쓰지 않고(정확히 말하자면 inner product만은 사용해도 됨) 로지스틱 회귀 2진 분류기를 만들어 오는 것.

하필 연구실에서 프로그래밍 가장 못하는 내가 걸려서 끙끙대다 결국엔 선배가 대신 코드를 짜줬다.

코드를 읽으면서 이해는 할 수 있도록 하는 것이 나의 이번 목표. (랄까 내일까지 해야됨)



[typing/type alias]

from typing import List, Tuple, Union

class Vector(object):
    def __init__(self, data: List[float]):
        self.data = data

    @property
    def shape(self) -> Tuple[int, ...]:
        return self.data.__len__(),
    def __neg__(self) -> 'Vector':
        return Vector([-element for element in self.data])

가장 처음에 이런 식으로 적어 놓았는데 typing 에서 List, Tuple, Union을 가져왔다는 뜻.

typing은 내장 모듈로, 비슷한 형태에 대해 파이썬이 헷갈리지 않도록 식별자를 적어주기 위함이라고. 파이썬이 제공하는 것으로는 Any, Union, Tuple, Callable, TypeVar, Generic 등이 있다고 한다. 자세히 확인하고 싶으면: PEP 484

type hint 를 간략히 하는데 편리한데 여기서 type hint라는 것은 파이썬이 코드를 읽고 예상하는 변수 타입이나 클래스 속성, 함수 파라메터, return 변수를 확신할 수 있도록 주석을 다는 일을 가리킨다.


이것은 의무는 아니지만 프로그래밍 꽤 하는 동기가 "이건 초보들이 적는 코드가 아니잖아..! 알기 쉽게 메소드 정의까지 잘 해놨어.." 라며 감탄한 것으로 보아 나도 적는 습관을 들여야겠다고 다짐했다.


type alias라는 것도 있는데 이건 type을 alias에 대입하는 것으로 정의된다고 한다. 예를 들면,

from typing import List
Vector = List[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

이런 식으로 Vector는 List[float]와 동의어로 취급한다고 알려주는 식으로.



[@property]


가장 위에 있는 코드에 보면 @property라는 것이 있는데, 이게 대체 무슨 역할이냐 물으니 선배 왈.

" '변수.함수()' 라는 식으로 쓸 때 ()안에 아무 것도 넣을 것이 없는데 계속 쓰면 귀찮잖아. 그럴 때 '@property'를 적으면 그 다음부터는 적지 않아도 에러가 안나" 라고.


파이썬 홈페이지에서 더 자세히 찾아보았다.

@라는 것은 데코레이터라는 함수로 @wrapper문법을 사용한 함수 변환으로 적용된다고 한다. 무슨 소린지 1도 모르겠다.

네이버를 뒤져보니 함수를 인자로 받는 함수라고도 하고 기존 함수에 기능을 추가해주는 함수라고도 한다.

간단히 말하자면,

class Name:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

라는 코드가 있을 때 @property가 있기 때문에 속성을 변경하기 위해 호출자를 수정하지 않아도 된다는 것이다.

아래와 같이 쓸 수 있음. 선배의 괄호 안에 넣지 않아도 된다는 말이 이 뜻인 듯..

일본어가 아직 잘 안되서 설명이 애매해졌나보다.

my_name = Name('홍길동')
my_name.name = '아무개'

@property가 없었다면 아래와 같이 두 번 적어줘야 속성이 바뀐다.

my_name = Name('홍길동')
my_name = Name('아무개')



[Tuple[int, ...]]


다시 가장 위 코드로 돌아가서:

class Vector(object):
    def __init__(self, data: List[float]):
        self.data = data

    @property
    def shape(self) -> Tuple[int, ...]:
        return self.data.__len__(),

Tuple[int, ...]가 신경쓰였기 때문에 물어보니 Tuple[int, int]는 2 개의 정수만을 갖는 튜플이지만 Tuple[int, ...]는 정수의 개수가 불특정한 튜플이라고 한다.

이 코드에서 리스트가 아니라 굳이 튜플을 사용한 이유는:

list는 varient-length homogeneous 데이터 구조이고 tuple은 fixed-length homogeneous 데이터 구조이기 때문이라고.

여기서 homogeneous라는 것은 이 구조 안에 있는 모든 데이터는 같은 타입이어야 한다(should를 썼으니까 그랬으면 좋겠다는 뜻일지도)는 뜻.

반대로 heterogeneous는 데이터 구조 안에 있는 이러한 데이터가 다른 타입일 수 있다는 말.




'파이썬3 노트' 카테고리의 다른 글

numpy 공부: [선형대수]  (0) 2018.08.10
numpy 공부: [Indexing] (3)  (0) 2018.08.09
numpy 공부: [Indexing] (2)  (0) 2018.08.08
numpy 공부: [indexing] (1)  (0) 2018.08.07
모듈/함수 공부: [데이터 모델] ①  (0) 2018.06.15