python 썸네일형 리스트형 Fluent Python (챕터 8) - 객체 참조, 가변성, 재활용 8.1 변수는 상자가 아니다. 흔히들 변수를 상자로 비유한다. 어떠한 값을 변수에 할당하면 변수라는 상자에 그 값이 들어간다고 표현한다. 하지만 이는 잘못된 비유다. 상자보다는 포스트잇에 빗대는 것이 더 명확한 비유라고 볼 수 있다. 단지 어떠한 값(객체) 에 이 값의 별명이 무엇이라고 포스트잇을 붙여 놓는 것과 같다. a = [1, 2, 3] b = a a.append(4) print(b) > [1, 2, 3, 4] 변수를 어떤 값을 담고 있는 상자라고 생각하면 위의 코드를 설명할 수 없다. a와 b는 서로 다른 상자임에도 a 에 추가한 값이 b 에도 들어가 있기 때문이다. 비슷한 맥락에서 할당에 관하여 어떠한 객체에 대해서 얘기할 때, '변수 s 가 객체에 할당되었다' 라고 하는 것이 '객체가 변수 .. 더보기 Architecture Patterns with Python(6장) 작업 단위 패턴(Unit of Work) 이번 장에서 작업 단위 패턴을 이용해 서비스 계층과 데이터 계층을 완전히 분리해본다. 기존에는 플라스크 앱이 직접 데이터베이스에 요청해 세션을 시작하고, 저장소 계층과 대화하여 SQLAlchemyRepository 를 초기화하며 서비스 계층에 할당을 요청한다. UoW 가 있는 경우 플라스크 API 는 작업 단위를 초기화하고, 서비스를 호출하는 일만 하게 된다. 파이썬에서 콘텍스트 관리자로 UoW 를 구현하여 이러한 것들이 가능하도록 한다. UoW 가 동작하는 모습을 미리 보면 아래와 같다. def add_batch( ref: str, sku: str, qty: int, eta: Optional[date], uow: unit_of_work.AbstractUnitOf.. 더보기 Architecture Patterns with Python(5장) 높은 기어비와 낮은 기어비 TDD 지금까지 했던 단위 테스트는 저수준에서 작동하며, 모델에 직접 작용한다. 이런 테스트를 상위 계층으로 끌어올리면 발생하는 트레이드오프와 더 많은 일반적인 테스트 지침에 대해 알아본다. 지난 서비스 계층 챕터에서 플라스크 앱에 있던 서비스 로직을 따로 분리하는 작업을 했다. 이를 통해 API 엔드포인트 부분이 http request /response 관련 부분만 신경쓸 수 있도록 가벼워졌고, 주요 서비스 관련 기능을 오케스트레이션 하는 서비스 계층과 저장소 패턴을 통한 가짜 저장소를 조합해 높은 수준의 테스트까지 가능해졌다. 여기서 한 단계 더 나아가보자. 서비스 계층은 서비스 로직를 테스트하기 때문에 더는 도메인 모델 테스트가 필요없다. 대신 앞선 1장에서 작성했던 도메.. 더보기 Fluent Python (챕터 7) 함수 데커레이터와 클로저 데커레이터를 자유자재로 사용하기 위해서는 클로저에 대한 이해가 필수이다. 클로저는 데커레이터 뿐만 아니라, 콜백을 이용한 효율적인 비동기 프로그래밍과 필요에 따라 함수형 스타일로 코딩하는 데에도 필수적이다. 이 장에서는 함수 데커레이터가 정확히 어떻게 동작하는지 설명한다. 그에 앞서 우선 아래의 내용을 먼저 살펴봐야 한다. 파이썬이 데커레이터 구문을 평가하는 방식 변수가 지역 변수인지 파이썬이 판단하는 방식 클로저의 존재 이유와 작동 방식 nonlocal 로 해결할 수 있는 문제 7.1 데커레이터 기본 지식 데커레이터는 다른 함수를 인수로 받는 콜러블이다. 데커레이터는 데커레이트된 함수에 어떤 처리를 수행하고, 함수를 반환하거나 함수를 다른 함수나 콜러블 객체로 대체한다. @de.. 더보기 Architecture Patterns with Python(4장) 플라스크 API와 서비스 계층 앞서 만든 도메인 서비스와 저장소 인터페이스를 엮어 깔끔한 아키텍처로 리팩토링 해본다. 다음과 같은 계획에 따른다. 1. 플라스크를 사용해 allocate 도메인 서비스(1장) 앞에 API 엔드 포인트를 위치한다. 데이터 베이스 세션과 저장소를 연결한다. 그 후 End to End 테스트와 SQL 을 활용한 테스트를 한다. 2. 서비스 계층을 리팩토링해서 플라스크와 도메인 모델 사이에 유스 케이스를 담는 추상화 역할을 할 수 있게 한다. 3. 서비스 계층의 기능을 여러 유형의 파라미터로 실험한다. 데이트베이스 한쪽 끝부터 API 사용하는 반대편 끝까지에 대한 테스트를 엔드투엔드 테스트 라고 한다. import pytest import uuid import requests i.. 더보기 Fluent Python (챕터 6) 일급 함수 디자인 패턴 디자인 패턴은 어떤 언어를 사용하는가에 따라 적용될 수도, 그렇지 않을 수도 있다. 특히 일급 함수를 지원하는 언어에서는 여러 패턴에 대해 다시 생각해 볼 수 있다. 패턴에 참여하는 일부 클래스의 객체를 간단한 함수로 교체하면 획일적으로 반복되는 코드의 상당 부분을 줄일 수 있다는 것이다. 이 장에서는 함수 객체를 이용해서 전략 패턴을 리팩토링하고, 비슷한 방법으로 명령 패턴을 단순화하는 방법에 대해 알아본다. 먼저 전략 패턴이 어떤 것인지 알아본다. 전략패턴이란? 일련의 알고리즘을 정의하고 각각을 하나의 클래스 안에 넣어서 교체하기 쉽게 만든다. 전략을 이용하면 사용하는 클라이언트에 따라 알고리즘을 독립적으로 변경할 수 있다. 즉, 특정한 기능(콘텍스트)에 대하여 클라이언트(객체.. 더보기 Architecture Patterns with Python(3장) 결합과 추상화 앞서 본 저장소 패턴은 저장소에 대한 추상화다. B 컴포넌트가 깨지는 게 두려워서 A 컴포넌트를 변경할 수 없는 경우를 이 두 컴포넌트가 서로 결합되어 있다고 한다. 지역적인 결합은 좋다. 코드가 서로 함께 동작하고, 한 컴포넌트가 다른 컴포넌트를 지원하며 시계 나사처럼 서로 맞물려 돌아간다. 그러나 전역적인 결합은 성가신 존재일 수 있다. 코드를 변경하는 데 드는 비용을 증가시키며, 결합이 커지면 아예 코드를 변경할 수 없는 지경에 이르기도 한다. 추상화를 통해 세부 사항을 감추면 시스템 내의 결합 정도를 줄일 수 있다. 추상화는 보통 단순화 하는 것이므로, 어떠한 시스템 사이에 추상화가 들어감으로써 의존하는 의존성의 종류가 줄어든다. 예를 들어, 원본(source)과 사본(destina.. 더보기 Fluent Python (챕터 5) 일급함수 파이썬의 함수는 일급 객체다. 프로그래밍 언어 이론가들은 다음과 같은 작업을 수행할 수 있는 프로그램 개체를 일급 객체로 정의한다. 런타임에 생성할 수 있다. 데이터 구조체의 변수나 요소에 할당할 수 있다. 함수 인수로 전달할 수 있다. 함수 결과로 반환할 수 있다. 정수, 문자열, 딕셔너리도 파이썬의 일급 객체다. 일급 객체로서의 함수인 일급 함수에 대해 알아본다. 인수를 하나 받는 함수는 모두 key 인수로 사용할 수 있다. def reverse(word): return word[::-1] fruits = ['apple', 'banana', 'fig', 'raspberry', 'cherry', 'strawberry'] print(sorted(fruits, key=reverse)) > ['ba.. 더보기 이전 1 2 3 4 5 다음