목록Python (9)
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은 모델로 데이터를 파싱하는 과정에서 파싱이 불가능한 값이 ..
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 자체에서 갖고 있으며, ..
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 = { ..
python test를 공부하는 과정에서 용어에 대한 정리가 필요하다고 생각하여 정리한다. fixture A software test fixture sets up a system for the software testing process by initializing it, thereby satisfying any preconditions the system may have ref: https://en.wikipedia.org/wiki/Test_fixture#Software 번역하자면 소프트웨어에서 테스트를 진행하기 전에 설정되어야 하는 고정값으로 이해할 수 있다. 테스트를 진행하기 전에 테스트에 대한 환경설정 혹은 테스트 케이스에 대한 값들이 있을 수 있겠다. 예시로 데이터 베이스 설정, 테스트에대한 y..