나는 이렇게 학습한다/Library 22

Python JSON 직렬화 TypeError 핸들링하기

json 변환 시 타입에러 발생 아래와 같이 Decimal 타입을 json 으로 변환하는 코드가 있다고 해보자. import json from decimal import Decimal data = {"value": Decimal("123.456")} json_str = json.dumps(data) print(json_str) 이를 실행하면 다음의 에러가 발생한다. raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type Decimal is not JSON serializable 왜냐하면 json 라이브러리는 기본적으로 다음 타입들만 직렬화를 지원하기 때문이다. dict list, tuple str int, fl..

Pydantic 옵션 하나로 ORM 을 DTO 모델로 변환하기

ORM 에서 DTO 로 모델 변환하기 ORM(Object-Relational Mapping) 객체를 통해 DB의 데이터를 가져왔다면 이를 DTO(Data Transfer Object)를 통해 다른 레이어로 전달하고 싶을 것이다. 이 글에서는 Pydantic 의 from_attributes=True 옵션을 활용하여 손쉽게 DTO를 생성하는 방법을 설명하고자 한다. 본론에 앞서 우선 ORM을 DTO로 변환하는 다양한 방법들을 살펴보자. (본론으로 넘어가고 싶다면 생략해도 좋다) 예를 들어 아래처럼 ORM과 DTO 모델이 명시되어 있다고 해보자. from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declar..

Pydantic 의 Datetime 타입으로 날짜와 시간을 다뤄보자

Pydantic 의 네 가지 Datetime 타입 Pydantic은 데이터 유효성 검사와 데이터 클래스 설정을 간결하게 만들어주는 Python 라이브러리다. Pydantic에서는 날짜와 시간을 다루는 특별한 타입이 있는데, AwareDatetime, NaiveDatetime, PastDatetime, FutureDatetime이 바로 그것이다. 이 글을 통해 각각의 타입이 어떻게 동작하고 언제 사용되는지 확인해보자. AwareDatetime AwareDatetime은 시간대(timezone) 정보가 포함된 datetime 객체를 의미한다. 세계 각지의 시간대를 일관성 있게 처리해야 할 때 유용하게 쓸 수 있다. 사용 예시 from pydantic import BaseModel from datetime i..

requests _ response 상태에 따라 raise를 할 수 있다?

외부 API로부터 받은 응답 값이 정상이 아니라면 우리는 응답이 잘못되었음을 어떻게 확인할 수 있을까? 매번 요청 때마다 응답의 상태 코드를 일일이 체크하고 핸들링해야 할까? python의 requests 라이브러리에서는 이러한 번거로움을 줄이기 위해 raise_for_status() 메서드가 있다. raise_for_status()는 응답의 상태 코드가 400 이상인 경우 HTTPError를 raise 한다. raise 를 통해 외부 모듈과의 통신상태를 확인하고 쉽게 핸들링을 할 수 있다. 사용법은 간단하다. requests 요청으로 응답받은 res 객체로부터 raise_for_status() 메서드를 호출하면 된다. url = "" res = requests.post(url) res.raise_for..

파이썬으로 해외 증권거래소 개장일/휴장일 확인하는 방법

덴마크 증권거래소는 몇 시에 열릴까? 국내 증권거래소의 정보는 손쉽게 구할 수 있다. 특히 개장일/휴장일의 경우 우리가 보는 달력만으로도 알 수 있다. 하지만 해외 증권거래소는 파악이 어렵다. 각 국가별로 공휴일이 다를 수 있고 시간도 상이하다. 특히 지역 시간대로 인해 정확한 시간을 파악하는 것이 더 어렵다. 덴마크 증권거래소를 예로 들어보겠다. 덴마크 장시작 시간이 몇 시인지 알고 있는가? 정답은 한국 시간으로 16시에 열린다.(이는 서머타임 시간이며 겨울에는 17시에 열린다.) 이미 본인에게 익숙한 시장이라면 어느 정도 파악해두고 있겠지만 그럼에도 각 국가별로 정확한 개장일과 개장시간을 파악하고 있는 것은 여간 성가신일이 아니다. 이러한 문제를 Python 라이브러리 exchange_calendar..

Tenacity _ 예외가 발생한 함수를 다시 실행하려면?

Tenacity 란? 보통 에러나 예외처리에 의해 런타임이 종료될 때가 있다. Tenacity는 런타임 종료없이 함수를 다시 실행시켜주는 Python 라이브러리이다. 사용법 1. Tenacity 설치 pip install tenacity 2. Tenacity 라이브러리 가져오기 및 함수 작성 import tenacity def throw_error(): print("running...") raise ValueError("Errors make me stronger") if __name__ == "__main__": throw_error() 이대로 스크립트를 실행해보면 우리가 의도한대로 에러가 발생하며 곧바로 스크립트가 종료된다. running... Traceback (most recent call last..

Click _ argument, option으로 인자 전달하기

Click 이란? click은 커맨드 명령 환경에서 Python 스크립트에 인자를 넣을 수 있도록 도와주는 라이브러리이다. 예를 들어 하나의 스크립트가 날짜에 따라 동작이 달라져야 한다고 가정해보자. 우리는 이를 위해 날짜별로 스크립트를 만들어야 할까? 만약 그렇게 하면 매일 '오늘의 스크립트'를 새로 만들어야 할 것이다. click은 이러한 문제를 쉽게 해결해준다. 스크립트에 날짜를 인자로 넣어 하나의 스크립트만으로 모든 날짜에 대한 동작을 수행할 수 있도록 도와주기 때문이다. 이번 글에서는 간단한 예시로 click 사용법을 익혀보자. Click 사용법 1. 설치하기 pip install click 터미널에서 명령어로 click 패키지를 설치한다. 2. click 라이브러리 가져오기 # practice..

Black _ Code Formatter 회피하는 방법

Black Code Formatter를 사용하는 이유는 일관된 코드 스타일을 유지함으로써 코드 가독성을 높이고 개발자들 간의 원활한 커뮤니케이션을 유도하기 위함이다. Python에서도 포맷팅 라이브러리가 있는데, 그중 Black은 대중적으로 많이 사용하는 Code Formatter 중에 하나이다. Code Formatter는 보통 '파일을 저장할 때'나 혹은 '커밋을 생성할 때' 등 자동 실행되도록 지정한다. 그런데 가끔은 Code Formatter 가 실행되지 않았으면 하는 때가 있다. 예를 들어 아래와 같은 dictionary가 있다고 가정해보자. 이를 포멧팅 하면 다음처럼 스타일이 수정된다. 포맷팅을 적용한 결과 코드라인이 13줄에서 58줄로 늘어났다... 이런 경우에는 포맷팅이 오히려 가독성을 떨..

python-dotenv _ 환경변수를 .env 파일로 관리하기

환경변수란? 환경변수(environment variable)는 컴퓨터가 사용하는 동적인 변수를 의미한다. 여기서 동적이란 '고정적이지 않은'이라는 의미이다. 환경변수는 프로세스를 동작시키는 데 사용하는 변수를 매번 새로 입력할 필요 없이, 시스템에 설정해두어 사용하는 변수를 의미한다. 이번 글에서 Python 프로그램을 실행할 때 환경변수를 파일 단위로 관리할 수 있는 python-dotenv에 대해 알아보자. 환경변수 설정 방법 mac 기준, 환경 변수를 설정하는데 ‘임시 설정’과 ‘영구 설정’ 두 가지 방법이 있다. 임시 설정 사용자가 터미널에 직접 환경 변수를 할당한다. 터미널에 export [환경변수 이름]=[환경변수 값] 형식으로 명령어를 입력해보자. export environ=456 다시 ex..

websockets _ Python 으로 비트코인 실시간 시세 가져오기 (feat. twelvedata)

주식이나 암호화폐는 실시간으로 거래가 이루어지기 때문에 시세 변동 또한 실시간으로 이루어진다. 때문에 정확한 정보를 고객에게 전달하기 위해서는 시장의 실시간 데이터를 가져와 가공 및 분석하여 고객에게 제공할 수 있어야 한다. 이번 글에서는 누구나 쉽게 따라할 수 있는, Python과 websockets으로 비트코인 시세 가져오기를 구현해보겠다. twelvedata 먼저 데이터를 어디서 가져올지 정해야하는데 이 글에서는 twelvedata를 사용하겠다. twelvedata는 재무데이터를 제공해주는 여러 곳 중 하나인데, 공식문서가 비교적 쉽게 설명되어있고 웹소켓을 간단히 테스트할 수 있는 웹페이지도 제공해주기 때문에 초보자가 접근하기 쉽다. 참고로 무료 계정에서는 최대 8개의 심볼(종목)을 수신받을 수 있..