고급 파이썬 타입
고급 파이썬 타입 (Advanced Python Types)
파이썬 타입을 다룰 때 유용할 수 있는 몇 가지 추가 아이디어를 소개할게요.
출처: 공식문서
Union 또는 Optional 사용하기
어떤 이유로 코드에서 |를 쓸 수 없다면, 예를 들어 타입 애너테이션이 아니라 response_model= 같은 곳이라면, 세로 막대(|) 대신 typing의 Union을 사용할 수 있어요.
예를 들어 어떤 값이 str 또는 None이 될 수 있다고 선언하려면 이렇게 해요.
from typing import Union
def say_hi(name: Union[str, None]):
print(f"Hi {name}!")
typing에는 어떤 값이 None이 될 수 있다고 선언하는 Optional이라는 단축키도 있어요.
제 아주 주관적인 관점에서 드리는 팁이에요.
- 🚨
Optional[SomeType]은 피하세요. - 대신 ✨
Union[SomeType, None]✨을 사용하세요.
둘 다 동등하고 밑에서는 같아요. 하지만 저는 Optional 대신 Union을 권해요. "optional"이라는 단어가 값이 선택적(optional)이라는 뜻을 암시하는 것처럼 보이기 때문이에요. 실제로는 "None이 될 수 있다"는 뜻인데, 선택적이지 않고 여전히 필수여도 그렇죠.
Union[SomeType, None]이 무슨 뜻인지 더 명확하게 드러낸다고 생각해요.
단지 단어와 이름에 관한 문제예요. 하지만 그 단어들이 여러분과 팀원이 코드에 대해 생각하는 방식을 바꿀 수 있죠.
예를 들어 이 함수를 볼게요.
from typing import Optional
def say_hi(name: Optional[str]):
print(f"Hey {name}!")
파라미터 name은 Optional[str]로 정의돼 있지만, 선택적이지 않아요. 파라미터 없이 함수를 호출할 수 없거든요.
say_hi() # Oh, no, this throws an error! 😱
name 파라미터는 여전히 필수(선택적이 아님)예요. 기본값이 없기 때문이죠. 그래도 name은 None을 값으로 받아들여요.
say_hi(name=None) # This works, None is valid 🎉
좋은 소식은, 대부분의 경우 |만으로 타입 유니온을 정의할 수 있다는 거예요.
def say_hi(name: str | None):
print(f"Hey {name}!")
그래서 보통 Optional이나 Union 같은 이름에 대해 걱정할 필요가 없어요. 😎
더 알아보기 (Learn more)
이 문서는 FastAPI 공식 문서 - Advanced Python Types를 한국어로 정리한 번역이에요. 원문에서 최신 내용과 더 다양한 예시를 확인하세요.