반응형

 

 

TypedDict는 Python에서 딕셔너리의 키와 값의 타입을 명확하게 정의할 수 있도록 해주는 기능입니다. typing.TypedDict를 사용하면, 특정 키가 어떤 타입의 값을 가져야 하는지 지정할 수 있습니다.

1. TypedDict 사용법

 

Python의 일반적인 딕셔너리는 어떤 키든, 어떤 값이든 저장할 수 있습니다. 하지만 TypedDict를 사용하면 정해진 키와 그에 대한 타입을 강제할 수 있습니다.

 

✅ 기본 예제

from typing import TypedDict

class User(TypedDict):
    name: str
    age: int
    email: str

user1: User = {"name": "Tom", "age": 30, "email": "tom@example.com"}  # ✅ 올바른 사용
user2: User = {"name": "Alice", "age": "25", "email": "alice@example.com"}  # ❌ age가 int가 아님

위 코드에서 UserTypedDict로 정의된 딕셔너리입니다.

name: str 타입이어야 함

age: int 타입이어야 함

email: str 타입이어야 함

 

만약 타입이 맞지 않는 값이 들어가면, 타입 체크 도구(예: mypy)가 오류를 감지합니다.

2. 선택적 키 (total=False)

 

기본적으로 TypedDict에 정의된 모든 키는 필수입니다. 하지만 total=False 옵션을 사용하면 일부 키를 선택적으로 만들 수 있습니다.

 

✅ 선택적 키 사용 예제

class User(TypedDict, total=False):
    name: str
    age: int
    email: str

user1: User = {"name": "Tom"}  # ✅ age, email이 없어도 됨
user2: User = {"name": "Alice", "age": 25}  # ✅ 일부 키만 포함 가능

위 코드에서 total=False를 사용했기 때문에, name, age, email 중 일부만 포함해도 됩니다.

3. 부분 선택적 키 (Python 3.11+)

 

Python 3.11부터는 Required[]NotRequired[]를 사용하여 일부 필드만 선택적으로 지정할 수 있습니다.

from typing import TypedDict, Required, NotRequired

class User(TypedDict):
    name: Required[str]  # 필수 키
    age: NotRequired[int]  # 선택적 키
    email: str  # 필수 키

user1: User = {"name": "Tom", "email": "tom@example.com"}  # ✅ age가 없어도 됨
user2: User = {"name": "Alice", "age": 25, "email": "alice@example.com"}  # ✅ 모두 포함 가능

Required[str]: 반드시 포함해야 하는 키

NotRequired[int]: 포함해도 되고, 생략해도 되는 키

4. 중첩 TypedDict 사용

 

TypedDict다른 TypedDict를 값으로 가질 수도 있습니다.

class Address(TypedDict):
    city: str
    zip_code: str

class User(TypedDict):
    name: str
    age: int
    address: Address  # 중첩 TypedDict

user: User = {
    "name": "Tom",
    "age": 30,
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}  # ✅ 올바른 사용

User 딕셔너리의 address 필드는 Address 타입을 따라야 합니다.

5. TypedDict vs. 일반 dict

비교 항목일반 dictTypedDict

타입 검사 불가능 가능 (mypy 사용)
키 존재 여부 검사 불가능 가능 (total=False로 조정 가능)
중첩 구조 가능하지만 타입 보장 어려움 가능하고 타입 보장됨
런타임 동작 딕셔너리처럼 작동 딕셔너리처럼 작동

TypedDict는 런타임에서는 일반 딕셔너리와 동일하게 동작하지만, 정적 타입 검사기(mypy)가 타입을 체크할 수 있도록 도와줍니다.

6. 언제 TypedDict를 사용할까?

딕셔너리 구조를 엄격하게 관리하고 싶을 때

JSON 데이터의 구조를 정의할 때

API 응답 데이터를 다룰 때

mypy와 함께 정적 타입 검사를 수행할 때

🔥 정리

TypedDict딕셔너리의 키와 값의 타입을 강제하는 기능

기본적으로 모든 키가 필수지만, total=FalseNotRequired[]를 사용하여 선택적 키 가능

다른 TypedDict중첩 사용 가능

정적 타입 검사기(mypy)와 함께 사용하면 오류를 방지할 수 있음

 

TypedDict를 활용하면, 데이터 구조를 명확하게 정의하고 타입 안전성을 높일 수 있습니다! 🚀

반응형
반응형

파이썬에서 특정 패키지에 속한 클래스 리스트를 확인하는 방법에는 여러 가지가 있습니다. 패키지의 구조를 탐색하고 내부의 클래스를 나열하는 방법을 정리해 드릴게요.

1. dir() 함수 사용

 

dir()을 사용하면 특정 패키지 내부에 어떤 객체(클래스, 함수, 변수 등)가 있는지 확인할 수 있습니다.

 

예제:

import sklearn

print(dir(sklearn))  # sklearn 패키지 내부의 객체 목록 출력

이렇게 하면 sklearn 패키지에 포함된 모듈과 클래스, 함수 등이 나열됩니다.

2. inspect 모듈 사용

 

inspect 모듈을 활용하면 특정 패키지나 모듈에서 클래스만 필터링해서 볼 수 있습니다.

 

예제:

import inspect
import sklearn.linear_model  # 예제: sklearn의 linear_model 모듈을 탐색

# linear_model 내부에서 클래스만 추출
classes = [name for name, obj in inspect.getmembers(sklearn.linear_model, inspect.isclass)]
print(classes)

이 코드를 실행하면 sklearn.linear_model 모듈에 포함된 클래스 목록을 출력합니다.

3. pkgutil 모듈로 하위 모듈 탐색

 

특정 패키지의 서브 모듈까지 탐색하고 싶다면 pkgutil을 활용할 수 있습니다.

 

예제:

import pkgutil
import sklearn

# sklearn 패키지 내부의 하위 모듈 찾기
modules = [module.name for module in pkgutil.iter_modules(sklearn.__path__)]
print(modules)

이 코드는 sklearn 패키지의 서브 모듈 목록을 출력합니다.

4. help() 사용

 

help(패키지명)을 사용하면 패키지 내부의 클래스 및 모듈 정보를 확인할 수 있습니다.

 

예제:

import sklearn.linear_model

help(sklearn.linear_model)

이렇게 하면 sklearn.linear_model 내부의 클래스와 함수에 대한 설명을 출력합니다.

5. __dict__ 사용

 

대부분의 패키지와 모듈은 __dict__ 속성을 가지고 있으며, 이를 통해 내부의 정의된 객체들을 확인할 수 있습니다.

 

예제:

import sklearn.linear_model

print(sklearn.linear_model.__dict__.keys())  # 내부 객체 목록 출력

6. dir() + getattr() 조합

 

패키지 내부의 객체를 getattr()을 통해 직접 가져와서 클래스인지 확인하는 방법입니다.

 

예제:

import sklearn.linear_model
import inspect

# sklearn.linear_model 내부의 클래스만 필터링
for name in dir(sklearn.linear_model):
    obj = getattr(sklearn.linear_model, name)
    if inspect.isclass(obj):
        print(name)

🔹 결론

단순한 목록 확인: dir(패키지명)

클래스 필터링: inspect.getmembers(모듈명, inspect.isclass)

서브 모듈 탐색: pkgutil.iter_modules(패키지명.__path__)

상세 설명 확인: help(패키지명)

 

필요한 방법을 선택해서 사용하면 됩니다! 😊

반응형

'[Lang] Python' 카테고리의 다른 글

TypedDict란?  (0) 2025.02.20
맥에서 파이썬 여러 버전 관리하는 법  (0) 2025.02.09
파이썬 의존성을 해결하는 방법  (0) 2025.02.08
pip command 리스트  (1) 2019.11.09
country code로 timezone 구하기  (0) 2016.11.09
python에서 switch/case 처럼 쓰기  (0) 2016.09.07
반응형

맥에서 여러 개의 파이썬 버전을 관리하는 방법은 크게 **pyenv**를 사용하는 방법과 **conda**를 사용하는 방법이 있습니다. 가장 유연하게 버전을 관리하려면 **pyenv**를 추천합니다.

1. pyenv를 이용한 파이썬 버전 관리 (추천)

 

pyenv는 사용자가 원하는 버전의 파이썬을 설치하고, 프로젝트별로 다른 버전을 사용할 수 있도록 도와줍니다.

 

설치 방법

# Homebrew 업데이트
brew update

# pyenv 설치
brew install pyenv

# pyenv 환경 변수 설정 (zsh 사용 시)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init --path)"' >> ~/.zshrc

# 적용
source ~/.zshrc

파이썬 버전 설치

# 설치 가능한 파이썬 버전 확인
pyenv install --list

# 특정 버전 설치 (예: 3.11.6)
pyenv install 3.11.6

# 전역(global) 기본 파이썬 버전 설정
pyenv global 3.11.6

# 특정 프로젝트 폴더에서만 특정 버전 사용
pyenv local 3.10.6  # 현재 폴더에서만 3.10.6 사용

# 현재 사용 중인 버전 확인
pyenv versions
python --version

2. conda를 이용한 관리

 

conda는 가상 환경과 패키지 관리를 함께 제공하는 도구로, 데이터 과학이나 머신러닝을 한다면 유용합니다.

 

설치 방법

# Miniconda 설치 (경량 버전)
brew install --cask miniconda

# conda 환경 변수 설정 (zsh 사용 시)
echo 'export PATH="$HOME/miniconda3/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

파이썬 버전 관리

# 새로운 환경 생성 (예: 파이썬 3.9 사용)
conda create --name py39 python=3.9

# 환경 활성화
conda activate py39

# 환경 비활성화
conda deactivate

# 설치된 환경 목록 보기
conda env list

3. macOS 기본 파이썬 사용 (비추천)

 

맥OS에는 기본적으로 /usr/bin/python3가 설치되어 있지만, 시스템 의존성이 많아서 직접 버전을 관리하는 것은 어렵습니다. 따라서 pyenvconda를 사용하는 것이 좋습니다.

추천 방법 요약

일반적인 개발용pyenv

데이터 과학, 머신러닝conda

 

어떤 방법이든 설정을 마친 후, python --version으로 제대로 적용되었는지 확인하세요! 🚀

반응형
반응형

🚀 파이썬 의존성을 빠르고 쉽게 해결하는 방법

 

Python 프로젝트에서 의존성 충돌이나 설치 문제를 신속하게 해결하는 방법을 정리해볼게요.

1️⃣ 가상 환경(venv, conda) 설정 후 패키지 정리

 

💡 가상 환경을 만들고 깨끗한 상태에서 다시 설치

가끔 기존 환경에 여러 패키지가 엉켜서 문제가 생길 수 있어요. 새 가상 환경을 만들고 필요한 패키지만 설치하면 의존성 충돌을 줄일 수 있어요.

 

🔹 venv 사용 (Python 기본 제공)

python -m venv new_env
source new_env/bin/activate  # Windows는 new_env\Scripts\activate
pip install --upgrade pip
pip install -r requirements.txt

이렇게 하면 새 환경에서 깨끗하게 시작할 수 있어요.

 

🔹 Conda 사용 (더 강력한 환경 관리)

conda create -n new_env python=3.10
conda activate new_env
pip install -r requirements.txt

Conda는 패키지 간 의존성을 더 잘 관리해서, 충돌을 줄이는데 도움이 돼요.

2️⃣ pip 충돌 해결: 패키지 재설치

 

💡 패키지를 강제로 다시 설치하여 충돌 해결

pip freeze > installed_packages.txt  # 현재 설치된 패키지 리스트 백업
pip uninstall -r installed_packages.txt -y  # 모든 패키지 제거
pip install --upgrade pip setuptools wheel  # 최신 pip 설치
pip install -r requirements.txt  # 의존성 다시 설치

이렇게 하면 기존 환경에서 의존성 문제를 한 번에 해결할 수 있어요.

3️⃣ 패키지 버전 문제 해결

 

💡 의존성 충돌 시, 문제 패키지 확인 후 버전 고정

pip check  # 현재 환경에서 충돌하는 패키지 확인
pip install "패키지명==특정버전"  # 특정 버전으로 맞추기

예를 들어, llama-indexnumpy와 충돌하면:

pip install numpy==1.23.5

이런 식으로 버전을 맞추면 해결될 수 있어요.

4️⃣ FastAPI, LangChain, LlamaIndex 등 최신 패키지 충돌 해결

 

최신 AI 관련 패키지(LlamaIndex, LangChain 등)는 종종 의존성 문제를 일으켜요. pip 대신 pip-compile을 사용하면 의존성을 자동으로 정리해줘요.

pip install pip-tools
pip-compile requirements.in  # 의존성 자동 정리
pip install -r requirements.txt

5️⃣ Docker 활용 (최후의 방법)

 

의존성 충돌이 너무 심하면 Docker를 사용해 완전한 격리된 환경에서 실행하는 것이 가장 좋은 방법이에요.

FROM python:3.10
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "your_script.py"]

이런 식으로 하면, 시스템 의존성과 관계없이 동일한 환경을 유지할 수 있어요.

📌 결론

 

빠르게 해결하고 싶다면?pip check 후 버전 맞추기

깨끗한 환경에서 재설치?venv 또는 conda 활용

자동으로 의존성을 정리하고 싶다면?pip-compile 사용

100% 충돌 없이 실행하려면?Docker 사용

 

🚀 venv + pip-compile 조합을 먼저 시도하고, 그래도 안 되면 Docker를 고려하는 게 가장 현실적인 해결책!

어떤 문제가 있는지 더 구체적으로 말해주면, 추가 해결 방법을 알려줄 수 있어! 🔥

반응형
반응형

Git에서 --옵션과 파일/경로를 구분하기 위해 사용됩니다. 특히 --는 Git 명령어에서 옵션(예: -b, -m)과 파일명을 명확히 구분하는 역할을 합니다.

 

예시 설명: git checkout -- file.txt

 

이 명령어는 file.txt 파일을 최신 커밋 상태로 복원하는 역할을 합니다. 즉, 워킹 디렉토리에서 파일을 수정했을 경우, 그 파일을 변경 전 상태(현재 브랜치의 마지막 커밋)로 되돌립니다.

 

의미:

1. -- 앞: Git 명령과 옵션이 올 수 있습니다.

여기서 checkout은 특정 브랜치로 이동하거나 파일을 복원하는 명령입니다.

2. -- 뒤: 파일이나 경로를 지정합니다.

file.txt라는 특정 파일이 대상입니다.

 

왜 --가 필요할까?

Git은 checkout 뒤에 오는 내용을 파일로 볼지 브랜치 이름으로 볼지 혼동할 수 있습니다.

--를 사용하면, Git이 file.txt를 브랜치가 아닌 파일로 인식하도록 명확히 알려줍니다.

 

예제:

1. 파일 복원하기 (변경 사항 삭제):

 

git checkout -- file.txt

 

file.txt의 워킹 디렉토리 수정 내용을 삭제하고, 마지막 커밋 상태로 되돌립니다.

 

2. 브랜치로 체크아웃 (다른 브랜치로 전환):

 

git checkout main

 

main은 브랜치 이름으로 인식됩니다.

 

3. 혼동 방지:

 

git checkout my-branch

 

Git은 my-branch가 브랜치인지 파일인지 모를 수 있습니다.

--를 사용하여 명확히 구분할 수 있습니다:

 

git checkout -- my-branch

 

여기서 my-branch는 파일로 간주됩니다.

 

정리:

--는 옵션과 파일/경로를 구분하는 역할을 합니다.

특히 브랜치 이름과 파일 이름이 겹치는 경우에 유용합니다.

git checkout -- file.txt파일을 변경 전 상태로 복원합니다.

반응형

'git' 카테고리의 다른 글

[git] git commit을 한 이후에 진행해야 하는 작업  (0) 2025.01.02
[git] commit 메시지 규칙  (0) 2025.01.01
[git] 주요 커맨드  (0) 2025.01.01

+ Recent posts