언어 Language/파이썬 Python

Q. 파이썬으로 개발할 때 타입 힌트type hints를 쓰면 좋은 점은?

Tap to restart 2022. 6. 30. 22:00

A. 개발자 실수로 인한 오류가 확 줄어든다!

 

파이썬은 동적 타입 언어Dynamically Typed Language

그때 그때 알아서 타입이 바뀌는 걸 동적 타입 언어라고 한다. 정적 타입 언어Statically Typed Language인 C나 자바는 변수를 선언할 때 타입부터 선언해야 한다. 하지만 파이썬은 동적 타입 언어니까 변수를 선언할 때 타입을 선언하지 않는다.

message = "Hello World!"
print(message)
message = 7
print(message)

위처럼 그냥 변수 = 문자열 하면 해당 변수에는 문자열이 담긴다. 그 다음에 숫자를 변수에 저장해도 전혀 문제 없이 잘 작동한다. 웹 개발 때 많이 쓰는 자바스크립트도 동적 타입 언어다.

동적 타입 언어 문제

알아서 바뀌니 좋긴 한데 에러가 발생하면 안 되는 프로그램을 만들 때는 자꾸 문제를 일으킨다.
파이썬에서는 아래와 같은 에러를 계속 만나게 된다.

object has no attribute


아래와 같은 코드를 실행하면 에러가 발생한다. john 객체에는 age란 속성이 없다고.

class Person:
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age
john = Person(name='John', gender='Male', age=23)
print(john.age)
john = 23
print(john.age)

실행 결과

AttributeError: 'int' object has no attribute 'age'


아니 뭐 저런 걸 실수해라고 할 수 있지만, 코드가 몇 천 줄 넘어가고 다른 공통 모듈 파일을 만들어서 쓰기 시작하고, 객체를 넘겨 주고 넘겨 받기 시작하면 정말 자주 발생한다.

타입 힌트type hints

타입 힌트는 파이썬 3.5에서 추가된 기능이다. 함수나 메소드를 정의할 때 파라미터에 타입 힌트를 추가할 수 있다.
아래는 공식 문서에 나온 예제다.

def greeting(name: str) -> str:
    return 'Hello ' + name

타입 힌트를 추가하면 위와 같은 에러를 굉장히 줄여 준다.
그 이유는 파이참Pycharm 같은 통합 개발 환경 프로그램IDE가 자동으로 에러를 잡아서 표시해주기 때문이다. 또 자동완성도 정확하게 해주기 때문에 개발할 때 시간도 단축된다.

테스트 코드 예

class Person:
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age


def change_age_with_type(person: Person, age: int) -> Person:
    person.age = age
    return person


def change_age_without_type(person, age):
    person.age = age
    return person


if __name__ == '__main__':
    john = Person('John', 'Male', 23)
    change_age_with_type(john, 23)
    change_age_with_type(23, john)
    change_age_without_type(23, john)

 

자동완성

당연히 타입 힌트가 있을 때 더 정확히 자동완성이 된다.

타입 힌트가 있으니 자동완성이 제대로 되는 것을 확인할 수 있다.

 

타입 힌트 있을 때 자동 완성

타입 힌트가 없으니 자동완성이 엉뚱한 게 나온다.

 

타입 힌트 없을 때 자동 완성

뭐 바로 위에 클래스가 있으니 보고 치면 되지라고 생각할 수 있다. 코드가 길어지면 파일이 많아지면 자기도 모르게 실수하게 된다.

오류 감지

아래 코드를 보면 노란색으로 23 john에 배경색이 다른 걸 볼 수 있다. 에러 표시다.
원래 john, 23으로 넣어야 하는데 순서가 틀렸다고 알려주는 거다.
타입 힌트를 넣은 경우 더 정확하게 알려주는 것을 알 수 있다.

 

잘못된 순서의 파라미터 오류 표시 비교

타입 힌트를 쓰면 아래처럼 쓰지 않아도 오류가 줄어 들어서 좋다.
change_age_with_type(person=john, age=23)

타입 힌트를 안 쓰면 위처럼 쓰더라도 엉뚱한 순서로 넣는 경우가 꼭 발생하고 사전에 인지하기 어렵다.

 

아쉬운 점

원래 있던 속성을 없앤다고 파이썬은 에러가 나지 않고, 표시도 안 해준다. 그냥 클래스 정의와 관계 없이 새로운 속성이 추가 된다. 파이썬 특성상 오류도 아니고 미리 속성을 정의하지도 않고, 그냥 self.속성 형태로 많이 쓰니 IDE 입장에서도 그걸 다 잡아내기 어려울 거 같다.

 

age 속성을 제거했지만 오류 표시가 없는 모습

 

파이썬으로 개발한다면 타입 힌트를 꼭 추천한다. 특히 장고Django 같은 백엔드 프레임워크로 개발할 때는 꼭 타입 힌트를 쓰자. 처음에는 귀찮지만 타입 힌트를 쓸수록 야근이 줄고 퇴근이 빨라지는 것을 경험하게 된다.

 

관련 글

Q. 파이썬에서 객체에 새로운 속성이 임의로 추가되지 않도록 하고 싶다면?

Q. 파이썬Python에서 타입 힌트Type hints를 적으면 타입이 변경될까?