Python 308

[Python] Template - 문자열 템플릿

개요Python에서는 f-string이라는 간편하고 강력한 방법으로 문자열 포맷팅을 제공해주고 있는데, 간혹 일부 값만 치환해야 하는 상황에서는 사용할 수 없는 경우가 있었다. python에서 기본적으로 제공하는 %-포맷팅이나 str.format 함수도 확인을 해봤는데, 아무래도 제공하지 않는 기능인 것 같다.이번 글에서는 문자열을 포맷팅하는 또 다른 방법인 Template이라는 기능을 소개하려고 한다.  TemplateTemplate은 string의 기능으로 간단한 문자열 포맷팅을 제공하는데, 여기서 말하는 간단하다는 말은 Python의 다른 내장 문자열 포맷팅 기능보다 번역하기 쉽게 만들어졌다는 의미이다. (코드 관점에서의 이야기인 듯?)string.Template은 $를 기반으로 문자열 치환을 제공..

Python 2024.10.02

[Tornado] httpclient - HTTP 요청

개요이전에 python의 requests를 사용해 http 요청하는 방법을 적어두었었는데, requests 라이브러리 외에 http 요청을 할 수 있는 방법은 여러 가지다. 이번 글에서는 Tornado의 httpclient 객체를 사용해 http 요청을 하는 방법을 적어둔다.  tornado.httpclienttornado.httpclient는 차단/비차단 HTTP 클라이언트 인터페이스다.simple_httpclient, curl_httpclient을 공유하는 공통 인터페이스를 정의하며, 사용자 애플리케이션은 적절한 구현 클래스를 직접 인스턴스화하거나 AsyncHTTPClient를 사용하여 재정의할 수 있는 구현 클래스를 선택할 수 있다. 기본적으로는 simple_httpclient를 사용한다.curl_..

Python 2024.09.30

[Python] singledispatch - Overloading 하기

개요2024.08.28-[Python] multipledispatch - Overloading 하기에서 Python에서 Overloading을 구현하는 방법에 대해서 정리했었는데, multipledispatch가 아니라 functools의 singledispatch를 이용한 방법도 존재하는 것 같아서 적어둔다.  singledispatchfunctools 라이브러리에서 제공하는 singledispatch는 함수를 인자 하나의 데이터 타입에 따라 구현이 결정되는 제네릭 함수로 변환하는 기능을 제공한다. ❓ 제네릭(Generic) 이란?하나의 값이 여러 데이터 타입을 가질 수 있는 기술에 중점을 두어 재사용성을 높이는 프로그래밍 방식함수 등을 정의할 때 인자에 구애받지 않고 같은 이름의 함수를 인자 타입에 ..

Python 2024.09.12

[Python] multipledispatch - Overloading 하기

개요컴퓨터 프로그래밍에서 메서드 오버로딩(Overloading)이란, 함수 이름은 같지만 매개변수나 반환 데이터 타입을 다르게 정의하는 것을 의미한다.Python은 함수를 정의할 때 타입을 지정하기 않기 때문에 기본적으로 오버로딩을 지원하지 않는다. 하지만 multipledispatch라는 라이브러리를 사용하면 오버로딩을 적용할 수 있다고 한다. 사용 방법을 정의한다.  multipledispatchPython multipledispatch는 상속, 인스턴스 메서드, 추상 클래스, Union 타입 지원 등을 제공하는 라이브러리이다.Python 기본 라이브러리가 아니기 때문에 pip 등으로 설치해야 한다.pip install multipledispatch  모듈 임포트메서드 오버로딩을 구현할 때는 disp..

Python 2024.09.11

[Python] 덕 타이핑 (Duck Typing)

개요객체 지향 프로그래밍과 관련된 개념으로 인터페이스가 존재하는데, 확인해 보니 현재 자주 사용하고 있는 언어인 Python에서는 지원하지 않는 것 같다. 대신 덕 타이핑이라는 개념이 객체 지향 프로그래밍의 인터페이스와 같은 기능을 수행할 수 있다고 한다.이번 글에서는 덕 타이핑이라는 개념에 대해서 적어두려고 한다.   덕 타이핑만약 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리면 그 새는 오리일 것이다.If it walks like a duck, and it quacks like a duck, then it must be a duck. 위의 명제는 오리 실험(The Duck Test)의 명제로, 대상의 습관적인 특성이나 특징을 통해 대상을 식별할 수 있다는 개념을 의미한다.덕 타이핑이라는 용어는 이런 오리 ..

Python 2024.09.09

[Python] 추상 클래스 (Abstract class)

개요최근 Python으로 Class를 직접 정의하여 작업하는 경우가 잦은데, 슬슬 추상 클래스나 인터페이스에 대한 수요가 생기기 시작했다.이번 글에서는 추상 클래스에 대한 개념을 되짚어보면서 Python으로 추상 클래스를 정의하는 방법을 적어둔다.   추상 클래스추상 메서드(Abstract Method)란 구현 없이 선언만 되어 있는 메서드를 말한다. 그리고 추상 클래스는 하나 이상의 추상 메서드를 가진 클래스를 말한다. 추상 클래스를 상속한 자식 클래스가 추상 메서드를 반드시 구현하도록 강제하여 기능을 확장하고자 할 때 사용한다. 클래스이기 때문에 변수나 일반 메서드를 정의할 수 있지만, 직접 객체를 생성할 수 없다는 특징이 있다. 추상 클래스는 추상화라는 기법을 클래스에 접목시킨 것으로, 객체를 구조..

Python 2024.09.05

[Tornado] on_finish 함수 비동기화 (?)

개요Tornado로 개발한 애플리케이션에서 Redis를 비동기로 연결하여 사용하고 있다. from tornado.web import RequestHandlerimport redis.asyncio as redisclass BaseHandler(RequestHandler): def prepare(self): self.redis_connection = redis.Redis() def on_finish(self): self.redis_connection.close()그러나 테스트를 해보니 Redis의 연결을 종료하는 시점에 다음과 같은 에러가 발생하는 것을 발견했다./home/brian/repos/medigator/venv/lib/python3.8/site-pa..

Python 2024.09.04

[Python] Redis - 비동기 연결

개요2023.06.03-[Python] redis 사용하기, 2024.08.07-[Python] redis - pub/sub 구현하기에서 Python redis 라이브러리를 사용해 Redis에 접속해 메세지를 다뤄봤다.공식 문서를 보니, Python redis는 비동기 처리도 지원하고 있었다. 이번 글에서는 비동기 방식으로 redis에 접속하고 메세지를 보내는 방법 등을 적어둔다.  import비동기 방식으로 redis를 사용할 때는 redis.asyncio를 import하여 사용한다. 보통 redis라고 축약하여 사용하는 것 같다.import redis.asyncio as redis참고로 redis.asyncio의 모든 함수는 코루틴이다. 필연적으로 asyncio도 함꼐 import하여 사용하게 된다...

Python 2024.09.03

[Python] redis - pub/sub 구현하기

개요2024.07.30-[Redis] Pub/Sub 개념, 2024.07.31-[Redis] Pub/Sub - 테스트에서 Pub/Sub 개념을 알아보고 간단히 테스트해 봤는데, 이번 글에서는 Python을 이용해 redis Pub/Sub 기능 구현해보려고 한다. + Python redis 라이브러리의 기본적인 사용법은 2023.06.03-[Python] redis 사용하기를 참고한다.  SubscribePython redis 라이브러리는 채널을 구독하고 새 메세지를 수신할 수 있도록 하는 pubsub 객체를 제공한다.import redisr = redis.Redis(host='localhost', port=6379, decode_responses=True)pubpub = r.pubsub()pubpub.s..

Python 2024.08.28

[Python] 동적으로 변수에 접근하기

개요특정 변수의 값에 따라 변수를 동적으로 접근하고 싶다. 예로 들어, 아래와 같이 API를 호출할 때 사용하기 위한 APICaller라는 클래스가 있다고 하자.class APICaller(): def __init__(self): self.t10_url = "http://127.0.0.1:10000" self.t20_url = "http://127.0.0.1:20000"APICaller는 API 요청할 서버의 타입 별로 url 값을 갖고 있다. 즉, t10_url은 t10이라는 서버 타입의 url이고, t20_url은 t20이라는 서버 타입의 url이다. 이때, 조건문을 사용하지 않고 API를 보낼 서버 타입을 의미하는 server_type 변수 값에 따라 APICaller..

Python 2024.08.19