Katharos: Python을 위한 함수형 프로그래밍 및 CSP 스타일의 동시성
Katharos는 예외나 None 체크와 같은 숨겨진 제어 흐름을 명시적이고, 조합 가능하며, 타입 안전한 값으로 대체하는 Python 3.13+용 함수형 프로그래밍 및 동시성 라이브러리입니다. 대수적 추상화와 메시지 전달 동시성 모델을 결합함으로써, Katharos는 개발자가 오류, 선택성(optionality), 그리고 동시 통신을 일급 객체 값으로 다룰 수 있게 해줍니다.
대수적 추상화 및 타입 안전한 값
Katharos는 보일러플레이트를 제거하고 null 값 및 예외와 관련된 런타임 오류를 줄이기 위해 핵심 함수형 프로그래밍 추상화를 구현합니다.
Maybe를 통한 None 체크 제거
흩어져 있는 if x is None 체크 대신, Katharos는 Maybe 타입을 사용합니다. 이를 통해 값이 없을 때 로직을 깔끔하게 단락(short-circuiting)시킬 수 있습니다.
from katharos.types import Maybe
from katharos.syntax_sugar import do, DoBlock
@do(Maybe)
def lookup_discount(user_id: int) -> DoBlock[Maybe, float]:
user = yield find_user(user_id)
account = yield find_account(user)
return account.discount # Returns Just(0.15) or Nothing()
Result를 통한 값으로서의 오류 처리
Katharos는 오류를 예외가 아닌 값으로 취급합니다. Result 타입은 파이프 연산자(|)를 사용하여 오류를 체인으로 연결할 수 있게 하며, 여기서 Failure는 나머지 체인의 실행을 자동으로 단락시킵니다.
수동적인 try/except 보일러플레이트를 줄이기 위해, @Result.catch 데코레이터는 특정 예외를 발생시키는 함수를 Result 타입을 반환하는 함수로 변환하며, 디버깅을 위해 원래의 트레이스백을 보존합니다.
from katharos.types import Result
@Result.catch(ValueError)
def parse_int(s: str) -> int:
return int(s)
# Returns Success(42) or Failure(ValueError(...))
result = parse_int("42")
추가적인 함수형 타입
- ImmutableList: Semigroup 연산자(
@)를 사용하여 결합할 수 있는 불변 시퀀스를 제공합니다. - Algebraic Core: 이 라이브러리는 다양한 타입 간의 일관된 조합을 보장하기 위해
Functor,Applicative,Monad,Semigroup,Monoid의 공식적인 구현을 제공합니다.
CSP 스타일의 동시성
Katharos는 Go 스타일의 Communicating Sequential Processes (CSP) 모델을 동시성 구현을 위해 사용하여, 동시 작업 간의 통신이 함수형 데이터 타입만큼이나 타입 안전하게 이루어지도록 보장합니다.
메시지 전달 및 채널
작업은 csp.go를 사용하여 동시적으로 실행되며, 통신은 타입이 지정된 Channel을 통해 이루어집니다. 결정적으로, 채널에서 값을 받는 것은 Result를 반환합니다. 이는 닫힌 채널이나 타임아웃이 발생한 채널이 잡아야 할 예외가 아니라, 패턴 매칭을 해야 할 값이라는 것을 의미합니다.
from katharos.concurrency.csp import csp
ch = csp.Channel[int](capacity=1)
# Run work concurrently
csp.go(ch.send, 42)
# Receive as a Result value
ch.recv() # Success(42)
ch.close()
ch.recv() # Failure(ChannelClosedError(...))
구조적 동시성
csp.go를 컨텍스트 매니저로 사용할 경우, 구조적 동시성 범위를 생성합니다. 프로그램은 해당 블록을 벗어나기 전에 블록 내에서 생성된 모든 작업을 조인(join)하며, 이를 통해 고루틴과 유사한 작업이 누출되는 것을 방지합니다.
with csp.go:
csp.go(worker, 1)
csp.go(worker, 2)
# Both workers are guaranteed to have finished here
플러그형 백엔드
Katharos의 모든 동시성 모델은 BaseThreadingBackend에 결합되어 있습니다. 표준 스레드는 기본값이지만, 이 추상화 덕분에 런타임 환경을을 단일 위치에서 다른 백엔드로 변경할 수 있습니다.
향후 업데이트에는 동일한 백엔드 추상화 위에 구축된 액터 모델(actor model)이 포함될 계획입니다.
구현 세부 사항 및 커뮤니티 피드백
Do-Notation 메커니즘
Katharos는 명령형 스타일의 모나딕 코드를 작성할 수 있도록 Python 제너레이터를 통해 do-notation을 제공합니다. 하지만 커뮤니티 피드백에 따르면, Python에는 call/cc (call-with-current-continuation)가 없기 때문에 특정 모나드(예: 리스트 모나드)에 대한 구현이 리스트 모나드를 재실행하는 방식이 될 수 있어, 사용 사례가 단순하거나