본문 바로가기
데이터 시각화 및 애플리케이션 개발/AI 컴퓨터 비전프로젝트

AI 컴퓨터 비전 프로젝트_2개월차_변수 타입 어노테이션

by 바다의 공간 2024. 6. 3.

1. 변수 타입 어노테이션

변수 타입 어노테이션은 파이썬 3.5부터 도입된 기능으로, 변수의 예상 타입을 명시하는데 사용됩니다.

이는 주로 코드의 가독성을 높이고, 정적 타입 검사 도구(예: mypy)를 사용하여 타입 오류를 사전에 잡아내기 위한 목적으로 사용됩니다.

타입 어노테이션은 실제로 변수의 타입을 강제하는 것이 아니라, 개발자가 변수가 어떤 타입을 가져야  것으로 예상하는지 명시하는 것입니다.(다른사람들에게 보여주는것이므로 주의깊게 사용하기)

이렇게 사용하게되면 변수타입의 가이가 되기때문에 실수는 적어지게 됩니다.

서버군중에 특히 FAST API는 보통 모두 변수타입 어노테이션을 많이 사용합니다.


2. 기본 타입 어노테이션

사용방법 :: 변수 뒤에 콜론(:) 쓰고 타입

name: str ="김사과"
age: int = 20
height: float = 160.5
is_adult: bool = True
 
print(name)
print(type(name))
 
#실행 결과
김사과
<class 'str'>
 

3. 리스트, 튜플, 딕셔너리, 세트

컬렉션(자료구조) 타입에 대한 어노테이션은 조금  복잡합니다. 이를 위해 List, Tuple, Dict, Set 등의 제네릭 타입을 사용하게 됩니다. 이러한 타입들은 typing 모듈에서 가져올  있습니다.

즉 모듈을 임포트해야 사용할 수 있습니다.

 

#리스트에 대한 어노테이션

from typing import List, Tuple, Dict, Set

단 쓰던 안 쓰던 에러는 나지않지만 컬렉션을 사용하기 위해서는 임포트를 해주어야 합니다.

 

#리스트에 대한 어노테이션

타입을 여러개 넣을 수 있습니다.

 

사용방법 :: 임포트된 클래스 [자료구조약자] = 자료구조리스트

임포트된 클래스에는 임포트된 클래스 타입을 작성하게 됩니다.

 

그 후 대괄호에 작성 후 자료구조 리스트로 사용하면 됩니다.

리스트에 타입이 다른경우로 여러개를 사용시에는 콤마(,)를 사용하여 나열해주면 됩니다.

같은타입 여러개도 가능합니다.

 
names: List[str] = ["김사과", "오렌지", "반하나"]
age: Tuple[int, int] = (25, 20)
student_scores: Dict[str, float] = {"김사과": 90.5, "오렌지": 88.0}
 
#중복된 값을 일부러 넣어 set인지 확인하기
unique_numbers: Set[int] = {1, 2, 3, 3, 4}

print(names)
print(age)
print(student_scores)
print(unique_numbers)

#실행결과

['김사과', '오렌지', '반하나']  ▶ 리스트타입

(25, 20) ▶ 튜플타입

{'김사과': 90.5, '오렌지': 88.0} ▶ 딕셔너리타입

 {1, 2, 3, 4} ▶세트타입

*세트는 중복된 값을 취급하지 않습니다.


4. 함수

단 함수는 return이 되어야하기에 변환되는 값도 표기를 할 수 있습니다.

함수의 매개변수와 반환 타입에 대한 어노테이션은 다음과 같이 합니다

단 강제성은 없습니다.

 

함수 리턴형  어노테이션사용(표기)방법 ::  ->int  

화살표를 작성 후 리턴될 타입을 적어주게 됩니다.

#a는 int로 넣기, b도 int로 넣으라는 가이드를 할 수 있습니다.
str로 넣을수도있기에 실수방지용!
 
def add(a: int, b: int) -> int: 
    return a + b
#출력확인
print(add(10, 3)) ▶ 13
 
# 에러가 발생하지는 않는것을 확인
사실 어노테이션은 값에 영향을 주지않는다는걸 확인할 수 있습니다. 정말 가이드의 역할
아무리 잘못된 파라미터를 넘겨도 변수타입어노테이션 자체가 문제가 되지는 않습니다.
 
print(add("10", "3")) ▶ 10삼

내 코드에서 가져온것이 아니라 다른 곳에서 임포트 되었다면 확인하기 위해서 모든 함수를 봐야하지만

타입어노테이션을 확인하게되면 파라미터와 리턴형을 알 수 있습니다.


# 타입 어노테이션을 확인 (스페셜메소드 활용)
print(add.__annotations__) 
 
#결과
{'a': int, 'b': int, 'return': int}
 

5. 클래스

클래스 또는 사용자 정의 타입에 대한 어노테이션도 가능합니다.

class Student:
    #객체, 생성자 생성
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age
   
    #오버라이딩
    def __str__(self) -> str:
        return '이름:' + self.name + ', 나이:' + str(self.age)
    # 이름 : 김사과, 나이 :20
 

스페셜매소드로 오버라이딩했으니 결과값은 아래와 같이 나옵니다.

스페셜매소드라는건 어떤건지 기억이 나지만 세부적으로는 다시한 번 공부를 해야할것같다..ㅠㅠ

#객체 student만들기  
student = Student('김사과', 20)
print(student) 이름 : 김사과, 나이 :20
print_student(student)  이름 : 김사과, 나이 :20

 


6. 옵셔널

변수가 특정 타입이거나 None  있는 경우 Optional 사용합니다.

 

#임포트하기

-옵셔널은 따로 임포틑 해주어야 합니다.

from typing import Optional
 

 

#결과가 optional

플로트로 출력이될텐데 어쩌면 none일수도있어 라는 뜻으로 해석할 수 있습니다.

*get은 키를 찾으라는 뜻

def find_score(name: str, scores: Dict[str, float]) -> Optional[float]:
    return scores.get(name)

 

#출력

find_score에서 점수는dic형태이고 거기에 넣는 딕셔너리 형태는 스트링과 플로트로 변환하세요라는 뜻입니다.

print(find_score('김사과', {'김사과':80.5, '오렌지':40.5, '반하나':90.5}))
print(find_score('이메론', {' '김사과':80.5, '오렌지':40.5, '반하나':90.5}))

 

#결과

80.5

None