목록Python (11)
The Boxer
pydantic 모델 파싱시 주의 사항 request나 response로 넘어온 body data를 pydantic이 model로 파싱하는 과정에서 정의된 필드가 비어있는 경우 에러를 던진다. 에러가 발생하는 예시 from pydantic import BaseModel class Foo(BaseModel): id: int name: str def service_method() -> dict: return { "name": "testing" } def controller_method() -> Foo: result = service_method() return Foo(**result) controller_method() pydantic은 모델로 데이터를 파싱하는 과정에서 파싱이 불가능한 값이 ..
fastapi를 공부하면서 의존성을 주입할 때 어떻게 처리되는지 궁금하여 공부한 내용을 정리한다. 의존성 관리 기존에 내가 사용하던 nestjs 프레임워크는 프레임워크 자체에서 DI container를 내장하고 있었고, provider를 통해 container 등록하여 사용하던 방식이었다. fastapi는 조금 다른것으로 보인다. 따로 DI container는 존재하지 않으며, 요청이 들어오면 요청에 대한 처리를 위해 필요한 의존성만 주입받는다. 의존성 주입이 가능한 객체는 callable한 객체이며, 실행을 통해 리소스를 반환해야 한다. 기본 작동 원리 main.py from typing import Union from fastapi import FastAPI,Depends from service im..
python에서 클래스 python에서는 클래스를 객체로 취급한다. class Foo: pass 이렇게 클래스를 선언하는건 Foo 라는 이름의 객체가 메모리에 올라갔다는 것을 의미한다. foo = Foo() 위에서 말했던 것 처럼 python에서는 클래스도 객체이기 때문에 Foo 라는 객체가 생성됨과 동시에, Foo 클래스를 통해 foo 라는 객체를 생성했다는 의미가 된다. 클래스도 객체이므로 변수 할당, 메서드 인자로 전달 등이 가능하다. class Foo: pass def print_object(v): print(v) print_object(Foo) var = Foo print(var) type type은 2가지 기능을 갖고 있다. 자료형 확인 일반적으로 우리가 아는 기능인 자료형 확인이다. type..
함수를 wrapping하여 함수에 추가 구문 적용을 재사용 가능하게 만드는 기능 쉽게 말하자면 함수의 호출 시점에 추가적인 작업을 적용 할 때 이를 재사용 가능하게 하는 기능이다 decorator가 없는 경우 def get_data_from_database(): print("start db connect") ... print("finish db connect") 위와 같이 함수 실행과 끝을 관제하는 로그를 추가한다고 하면 함수의 실행 앞뒤로 로그를 추가해야 한다. 다만, 위와 같은 관제 기능이 모든 함수에 추가되어야 한다고 하면, 모든 부분에 동일한 소스코드를 추가해야 한다. decorator를 통해 위 기능을 재사용 가능하게 만들어 모든 코드에 공통적으로 적용한다. decorator 사용 def fun..
python에서 모든 자료형은 객체로 저장한다. a = 1 이라 함은 java나 c 처럼 1이라는 값이 들어가는게 아니라 1이라는 값을 가진 integer 객체가 들어가는 것 mutable 실행 단계에서 객체 내부의 값을 수정할 수 있는 객체 list, set, dictionary 등이 mutable 객체에 속함 foo = [ 1,2 ] print(id(foo)) foo.append(3) print(id(foo)) > 4337981376 4337981376 위 경우에서 foo라는 list에 하나의 아이템을 추가해면 객체 내부의 값이 변하지만, foo가 참조하는 객체는 동일하다 copy foo = [ 1,2 ] bar = foo foo.append(3) print(foo) print(bar) >..
python에서는 메모리 효율을 높이기 위해 object interning이란 기법을 사용한다 object interning: python에서 immutable한 객체에 한해 동일한 값을 하나만을 메모리공간에 저장하여 효율적으로 메모리를 관리하는 방식 string의 경우 >>> a = "hello" >>> b = "hello" >>> a is b True a와 b는 같은 값이지만 다른 변수에 할당되었으므로 다른 reference를 참조하고 있는 것으로 봐야한다. 하지만, object interning에 의해 "hello"라는 값은 하나의 메모리 공간에 저장되고 a와 b는 해당 메모리 공간을 참조한다. >>> id(a) 4300925552 >>> id(b) 4300925552 다만 다음과 같이 특수 문자나..
python 3.7 부터 추가된 모듈 python에서 class를 통해 데이터를 저장하면 type 안전하게 데이터를 저장할 수 있음 data를 class로 저장하거나 비교, 출력하는 기능을 편하게 해주는 모듈 dataclass를 사용하지 않은 경우 데이터 저장 class Foo: def __init__(self, id: int, name: str, admin: bool): self.id = id self.name = name self.admin = admin 각 데이터를 저장하는데만 변수가 3번이 사용되어 데이터를 저장하기 위해서 너무 많은 코드가 필요하다 변수 갯수가 많아지면 더욱 많은 작업이 필요하며, 휴먼에러가 발생하기도 쉽다. 동등 비교 일반적인 class에서 동등 비교를 위해선 __eq__()를..
instance 변수 각 instance 마다 갖고 있는 독립된 변수 클래스로 부터 몇 개의 인스턴스를 만들어도 각 인스턴스의 값은 독립적이다. python에서 self 예약어를 사용하여 접근 클래스 인스턴스가 생성되는 순간 메모리에 적재되며, 인스턴스가 생성되기 이전에 접근 불가 class Foo: def __init__(self): self.a = 1 접근 범위 인스턴스의 메서드, 클래스의 생성자, 소멸자 등에서 접근 가능 class Foo: def __init__(self): self.foo = "foo" def __del__(self): del self.foo def print(self): print(self.foo) > "foo" class 변수 class 자체에서 갖고 있으며, ..
fastapi는 어플리케이션을 실행하는 시점에 swagger 페이지를 기본으로 생성해준다. controller를 등록하면 해당 endpoint에 대한 spec을 fastapi에서 자동으로 swagger 페이지에 등록해주며, 다양한 설정 또한 가능하다. 다만, swagger 페이지 자체를 fastapi에서 관리하여 커스터마이징이 어렵다. swagger 페이지에 http 기본 인증을 추가하는 방법을 알아본다. 1. 기본 인증을 적용한 endpoint 생성 fastapi에서 http basic auth를 위한 HTTPBasic, HTTPBasicCredentials 라이브러리가 있다. 두 라이브러리를 사용하여 기본 인증 구현 from fastapi.security import HTTPBasic, HTTPBas..
python에서 사용하는 data parsing and validation 라이브러리 parsing과 validation을 담당한다고 적었는데 pydantic이 data를 어떻게 parsing하고 validation 하는지 확인해보자. 작동 순서 정상 파싱이 가능한 경우 from datetime import datetime from typing import List, Tuple from pydantic import BaseModel class Bar(BaseModel): id: int name: str class Foo(BaseModel): id: int name: str numbers: List[int] tup: Tuple[str, int] bar: Bar template = { ..