Python 112

[Python] 데이터 직렬화 및 검증 라이브러리 비교 (with 웹프레임워크)

요약아래 표를 기준으로 사용 환경, 타입 검사, 문서화 여부 등이 주된 기준 요소 일 것 같다.제공되는 기능 자체는 동일해서, 라이브러리 사용 방식? 이 보다 편하게 느껴지는 것으로 선택하면 될 것 같다.   PydanticDRFMarshmallowCerberusColanderVoluptuousAttrsSchematics릴리즈 날짜2018년 1월2011년 7월2013년 5월2014년 1월2010년 6월2012년 9월2016년 4월2013년 7월사용 환경FastAPIDjangoFlaskChalice일반 PythonPyramid일반 Python타입 검사파이썬 타입 힌팅명시적 타입필드명시적 필드 타입명시적 필드 타입명시적 필드 타입명시적 필드 타입파이썬 타입 힌팅명시적 필드 타입유효성 검사다양한 기본 제공 유..

Python/Advanced 2024.08.04

[최적화] Python 인터닝(Interning) 기법

인터닝 (Interning)인터닝(Interning) 은 동일한 값을 가진 불변 "객체"를 하나만 유지하여 메모리 사용을 최적화하고, 객체 비교를 빠르게 하는 기술 파이썬에서의 인터닝의 특징일정 길이의 문자열에 대해서 자동으로 인터닝이 적용된다.일정 크기의 숫자에 대해서 자동으로 인터닝이 적용된다.사용자가 sys.intern 으로 직접 인터닝 풀에 집어넣어 놓고 관리할 수 있다.일정 길이, 일정 크기는 cpython 즉 python 버전에 따라 다를 수 있다.주로 메모리 사용 최적화에 사용된다. 인터닝 예시 코드# Python 언어의 자동 인터닝 o# 문자열 str1, str2 = 'abcdefg', 'abcdefg'# id 함수는 객체가 메모리 내에 위치 반환print(id(str1) == id(str..

Python/Advanced 2024.08.03

Python 코드 실행 과정

인터프리터 언어 Python 파이썬은 인터프리터 언어로 CPython 이라는 컴파일러에 의해 소스 코드를 바이트 코드로 변환하여 PVM (Python Virtual Machine) 에 의해 기계어로 한줄 한줄 번역 (인터프리팅) 되며 실행 (실행되는 이 순간을 런타임 이라고도 함)된다. Python 실행 과정 .py 코드 작성Python 인터프리터(Cpython) 가 소스 코드를 읽어 바이트 코드(.pyc 파일) 로 변환 및 저장- 문법적인 오류가 있다거나 등 이면 에러 발생Python 가상 머신(PVM)은 바이트코드를 읽고 실행- 바이트 코드를 한줄 한줄 번역하여 프로그램을 실행- Python의 메모리 관리, 변수 처리, 함수 호출 등이 이루어짐PVM 에서 실행 중 오류가 있다면 에러 발생이러한 과정을..

Python/Advanced 2024.07.31

[Naver Map] 요구사항 별 사용 API 및 기능 정리 등

나중에 네이버 맵 (Naver Map) 관련 API 사용이나 정보가 필요시 때를 위한 정리 주소 정보 검색 으로 위경도 얻기기능 개요 지번, 도로명를 질의어로 사용해서 주소 정보를 검색 검색 결과 주소 목록 및 세부 정보 (위경도 좌표 포함) 네이버 API 문서 (링크)  사용법네이버 클라우드 콘솔에서 application 생성하고 client id (X-NCP-APIGW-API-KEY-ID) 얻기해당 정보를 querystring에 사용요청 URL 예시) GET https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode-js?X-NCP-APIGW-API-KEY-ID=&query=색어: 논현동 15-1>응답으로 주소 정보 및 위경도 좌표 반환 네이버 맵 U..

Python/Utils 2024.07.27

[Django, DB] haversine 두 지점의 거리 Django Func 사용하기

두 지점의 거리 구하기 공식 - haversine하버사인 공식(Haversine Formula) 공식은 구위의 두 점 사이의 거리를 경도와 위도를 고려하여 계산하는 공식 지도 맵 서비스 등에서 두 지점 간 거리를 재는데 사용 가능하다. 아래 그림의 P와 Q사이의 거리를 계산해준다.    haversine - PostgreSQL, MySQLDB에 맞춰 사소한 문법 등은 달라 질 수 있다.  만약 MySQL을 사용한다면, 기존에 내제되어 있는 Point 필드 등을 사용한 거리 계산도 가능하다. -- 두 위경도 사이의 거리 계산CREATE OR REPLACE FUNCTION haversine( lat1 numeric, lon1 numeric, lat2 numeric, lon2 numeri..

Python/Django 2024.06.30

[Python] 모듈과 패키지

모듈과 패키지의 관계모듈은 하나의 .py 파일들 / 혹은 파일 내 클래스, 함수, 변수 등을 지칭함파이썬 모듈은 다음과 같이 사용함# random 내장 라이브러리 모듈 importimport random# random 모듈의 shuffle() 함수 importfrom random import random_shuffle# random 모듈의 shuffle() 함수 importimport random.random_shuffle  패키지는 모듈(혹은 패키지)을 포함하는 디렉토리(directory)를 지칭함# Ipython 폴더의 display 폴더의 Image 라는 모듈을 importfrom IPython.display import Image  폴더 구조의 __init__.py__init__.py 란 다음 ..

Python/Advanced 2024.06.22

[Django] Django Models 와 @property

@propertypython에서는 @property라는 decorator를 제공하는데,  해당 클래스의 객체 변수처럼 사용될 수 있게 하며, 캡슐화 목적으로 주로 사용된다. property 코드 예시class Profile: def __init__(self, first_name:str, last_name:str): self.first_name = first_name self.last_name = last_name @property def full_name(self): return self.first_name + self.last_nameprofile = Profile("홍","길동")print(profile.first_name) # "홍"print(p..

Python/Django 2024.06.16

[Django] Prefetch 에 대한 이해

Prefetch 란perfetch_related 함수는 쿼리에서 Join을 하지 않고, 개별 쿼리를 실행 한 후 django에서 직접 데이터를 조합하는 것 예시) A, B, C 모델이 존재 / A:B 는 1:N / B:C 는 1:N의 관계를 가짐 비교 1 ) A에서 C 까지의 Prefetch1안. Prefetch 병렬로 쓰기a = ( A.objects.filter(id=1).prefetch_related( Prefetch( "b_set", # A에서 B 역참조 ), Prefetch( "b_set__c_set", # A에서 C역참조 ), )).first() 2안. Prefetch 중첩해서 쓰기a = ( ..

Python/Django 2024.05.19

[Django-Ninja] API 문서 Docs 커스텀

Ninja Docs기본적으로 Ninja에서는 가벼운 설정으로 Swagger나 Redoc을 지원하며https://django-ninja.dev/guides/api-docs/ 문서를 관리하기 위한 다양한 부가 기능들이 존재한다.문서 권한 설정문서 숨기기커스텀 태그 (openapi_extra 속성 v1이상 지원)커스텀 Docs 만들기 (링크) 등 도 가능하다. 문서 숨기기기본적으로 /api/openapi.json 을 바탕으로 -> /api/docs 의 문서를 생성해준다. 이를 Production 등에 활용시 다음과 같이 설정하면, url을 감춰준다.from ninja import NinjaAPIapi = NinjaAPI(docs_url=None) 참고 링크https://github.com/vitalik/dja..

Python/Django Ninja 2024.05.18

[Django Ninja] 배포용 도커파일 (Dockerfile)

Dockerfile 기본적으로 Multi-Builder 사용 (builder-image / runtime-image) 만약 linux 에서 제공하는 도구(vi 등)를 쓰고 싶다면 설치 후 runtime-image 에 복사 해야 함 프로젝트명 : mysite / 실행 log는 ./access.log 에 기록배포는 uvicorn에 gunicorn을 worker로 사용하여 실행 (worker 갯수는 cpu 코어 갯수 * 2)로컬에 배포 하고 싶다면 ${SERVER_IP} 를 수정 (ex. 127.0.0.1 / 0.0.0.0 )#################### Server Build ####################FROM python:3.11-slim AS builder-imageRUN apt-get ..

Python/Django Ninja 2024.04.21