[Python] Uv에 대하여
·
Language/Python
Uv는 Rust 기반의 패키지 관리 프로그램으로, Python의 여러 버전을 하나의 머신에서 사용할 수 있게 관리해줍니다. Python은 역사가 오래된 언어이기 때문에, pip나 conda와 같은 대표적인 패키지 관리 프로그램이 등장하기 이전에도 여러 종류의 프로그램이 존재했습니다. 이들은 모두 기능이나 특징이 조금씩 달라서, 단일화된 Python 생태계를 유지하는데 어려움을 주게 되었습니다. 이런 맥락에서 등장한 Uv는 기존의 패키지 관리 프로그램들을 하나로 통합하는 것을 목표로 만들어졌습니다. 우리가 pip나 conda에서 하던 것 처럼 패키지와 라이브러리를 쉽게 설치할 수 있을 뿐 아니라, 가상환경을 생성하거나 Python의 버전 또한 다양하게 설치하고 전환할 수 있습니다. 그러면서도 Rust의 특..
[Python] Library | 11. typing
·
Language/Python
typing은 Python에 타입 힌트를 추가하여 코드의 가독성을 높이고, 버그를 사전에 예방할 수 있도록 도와주는 라이브러리입니다. Python은 실행 전까지 변수의 타입을 체크하지 않는 동적 타이핑을 사용하지만, typing을 쓰면 코드를 실행하지 않고도 mypy 같은 정적 분석 도구를 통해 오류를 잡아낼 수 있습니다. 단, 3.9 버전 이상 부터 기본적인 타입에 대해서는 typing 없이도 직접 타입을 명시할 수 있습니다.def process_scores(names: list[str], scores: dict[str, int]) -> float: return sum(scores.values()) / len(names)타입 종류아래는 typing에서 지원하는 타입들에 대한 목록입니다.타입기능예시..
[Python] Library | 10. logging
·
Language/Python
logging은 로그 기록을 생성 및 관리하는 라이브러리입니다. 별도의 설치 없이 사용할 수 있습니다. 코드의 진행상황을 출력하는 로그는 print()를 사용해도 구현할 수 있긴 합니다. 하지만 logging을 사용하면 출력 터미널에 기록이 나타나는 것에서 멈추지 않고 파일로 남기거나, DB에 남기는 것도 가능해집니다.getLogger( )logging은 기본적으로 Logger 객체를 생성하는 것에서 시작합니다. Logger 객체는 getLogger()함수로 생성할 수 있습니다.import logginglogger = logging.getLogger(__name__)Logger를 통해 띄울 수 있는 로그의 종류는 아래와 같습니다if __name__ == "__main__": logger.debug(..
[Python] Library | 09. dotenv
·
Language/Python
dotenv는 Python이 많은 양의 환경변수를 관리할 수 있도록 .env 파일을 사용하게 하는 라이브러리입니다. dotenv는 별도로 설치가 필요합니다.pip install python-dotenv환경 변수가 한두 개일 때는 시스템 환경 변수에 추가해서 사용할 수 있습니다. 하지만 환경 변수가 많아지면 일일이 추가하는게 힘들어지므로, .env 파일에 모두 저장하여 관리하는 경우도 있습니다. dotenv는 Python이 .env 파일에 접근할 수 있도록 해줍니다. .env 파일이 이렇게 구성되어 있다고 합시다.ENV1=asdfghjkENV2=qwertyuiopPython에서 load_dotenv( ) 함수를 이용해 .env 파일을 불러올 수 있습니다. 불러온 환경변수들은 특정 변수에 저장되는 것은 아니..
[Python] Syntax | 04. import
·
Language/Python
import는 외부 파일(모듈)이나 폴더(패키지)에 작성된 코드를 가져와 사용하는 기능입니다.동작 과정import는 코드가 실행되는 런타임에서, import 줄을 만났을 때 실행됩니다. 그래서 코드를 실행하기 전 까지는 모듈을 가져오지 않습니다.import를 통해 가져오는 코드들도 caching의 대상이 될 수 있습니다. 만약 처음 import 하는 모듈(또는 패키지)라면, sys.path를 참고하여 해당 모듈이 위치한 경로를 따라 코드를 가져옵니다. 첫 import가 완료되면, sys.module라는 dictionary 객체에 해당 모듈 코드를 저장합니다. 이후에 같은 모듈을 import 하면, sys.module에서 그 모듈이 존재하는지 확인합니다. 존재한다면 저장된 객체 주소를 불러와 사용합니다.작..
[Python] Syntax | 03. Decorator(@)
·
Language/Python
데코레이터(Decorator)는 기존 함수의 코드를 직접 수정하지 않으면서 새로운 기능을 추가하는 기능입니다.표기법(@)데코레이터도 일종의 함수입니다. 단, 목표하는 함수를 인자로 받아 그 함수 앞뒤로 추가 기능을 구현한 새로운 함수(일반적으로 wrapper라고 부릅니다)를 반환한다는 특징이 있습니다.def my_decorator(func): def wrapper(): print("--- 함수 실행 전 ---") func() # 데코레이터가 적용될 함수 print("--- 함수 실행 후 ---") return wrapper # 새로운 함수를 반환합니다def say_hello(): print("안녕하세요!")dec_say_hello =..
[Python] Event Loop
·
Language/Python
Event Loop는 프로그램이 single thread로 동작하면서도 여러 개의 작업을 동시에 실행하여 multi threading 처럼 보이게 해주는 시스템입니다.구성요소Python의 event loop는 크게 call stack과 ready queue 부분으로 나누어져 있습니다.call stack : 호출된 함수가 쌓이는 공간입니다. 해결된 함수는 call stack에서 제거됩니다. Event loops는 함수가 실행되는 동안 제어권을 넘겨줬다가 함수가 종료될 때 다시 제어권을 받습니다.ready queue : task*들이 call stack에 쌓이기 위해 대기하는 공간입니다. Call stack이 비면 task를 하나씩 빼서 call stack에 추가합니다.*task : coroutine(비동기..
[Python] Library | 08. asyncio
·
Language/Python
asyncio는 coroutine을 사용하여 Python에서 비동기 처리를 구현할 수 있게 해주는 라이브러리입니다.async-await 구문 (Coroutine)비동기 함수를 선언하고 그 안에서 비동기 작업을 기다립니다. await과 함께 나오는 작업이 다 완료되기 전 까지는 다음 줄이 실행되지 않습니다. 여기서 async def로 정의된 함수를 coroutine이라고 합니다.import asyncioasync def say_after(delay, what): await asyncio.sleep(delay) # delay만큼 시간이 흐르기 전까지는 더 진행되지 않습니다. return whatrun()async 함수를 실행하려면 asyncio.run()을 사용하면 됩니다. 일반적으로 진입점에서..