[Python]Archive

Jaewon Lim·2024년 10월 31일

Q1. 절대경로와 상대경로는 무엇인가요?

  • 내 경험을 먼저 말해보면 내 로컬에서는 문제가 없는데, 이 파일을 다른 사람 컴퓨터에서는 에러가 발생하는 문제점이 있었다. 디렉토리 경로와 문제가 있는건데, 너무 기초적이면서 중요한 부분이다.절대경로와 상대경로는 컴퓨터 파일 시스템이나 디렉토리의 위치를 나타내는 두 가지 방법이다. 주요 차이점은 경로가 시스템의 루트 디렉토리와 관계에 따라 정의된다.
  1. 절대경로: root부터 해당 파일까지의 전체 경로(URL)를 의미한다.즉, import 하는 파일이나 경로에 상관없이 항상 경로가 동일하다. 대신 경로가 길어지는 단점이 있다. ex) /home/user/documents/file.txt

  2. 상대경로: 현재 작업 디렉토리를 기준으로 파일이나 디렉토리의 위치를 나타낸다.import 하는 위치를 기준으로 경로를 정의한다. 주로 local package 안에서 다른 local package 로 import 할 때 사용한다.
    ex) documents/file.txt

  3. 차이 : 파일 시스템의 루트 디렉토리에서 시작하여 전체 경로를 제공하느냐, 현재 작업 디렉토리를 기준으로만 경로를 제공하느냐 차이

기존 내 문제점을 해결하기 위해서 상대경로를 사용했다. 코드에서 파일 경로를 지정할 대 상대경로를 사용하여 프로젝트의 루트 디렉토리를 기준으로 파일을 찾도록 한다. 예를 들어, os.path 모듈을 사용하여 현재 스크립트의 디렉토리를 기준으로 상대경로를 계산할 수 있다.

또 한 방법으로는 argparse 사용을 하라고 배웠다. 사용자에게 파일 경로를 직접 입력받도록 함으로써 파일 경로 문제를 해결한다. 파일경로를 인자로 전달받아 처리할 수 있다. 호출 당시 인자값을 줘서 동작을 다르게 하고 싶을 때!!!!

import argparse
import os
#ArgumentParser 객체 생성
parser = argparse.ArgumentParser(description='파일 경로를 입력받는 스크립트')
#입력받을 인자 추가
parser.add_argument('file_path', type=str, help='읽을 파일의 경로')
args = parser.parse_args()
file_path = args.file_path

Q2. Git에서 branch는 무엇이고, 왜 사용하나요?

  • git에서 하나의 프로젝트를 여러가지 버전으로 관리하기 위함. 업데이트되고 배포하는 과정속에서 각각 다른 영역에서 코드를 만들 때 그 브랜치로 이동해서 작업을 진행한다.
    -- 무료버전,유료버전
    -- 실제 배포용, 개발용, 테스트용, 버그 수정용 등등..
    -- 스마트폰 버전, PC버전, TV버전

Q3. git commands

𝟭. 𝗴𝗶𝘁 𝗱𝗶𝗳𝗳: Show file differences not yet staged.
𝟮. 𝗴𝗶𝘁 𝗰𝗼𝗺𝗺𝗶𝘁 -𝗮 -𝗺 "𝗰𝗼𝗺𝗺𝗶𝘁 𝗺𝗲𝘀𝘀𝗮𝗴𝗲": Commit all tracked changes with a message.
𝟯. 𝗴𝗶𝘁 𝘀𝘁𝗮𝘁𝘂𝘀: Show the state of your working directory.
𝟰. 𝗴𝗶𝘁 𝗮𝗱𝗱 𝗳𝗶𝗹𝗲𝗽𝗮𝘁𝗵:Add file(s) to the staging area.
𝟱. 𝗴𝗶𝘁 𝗰𝗵𝗲𝗰𝗸𝗼𝘂𝘁 -𝗯 𝗯𝗿𝗮𝗻𝗰𝗵
𝗻𝗮𝗺𝗲: Create and switch to a new branch.
𝟲. 𝗴𝗶𝘁 𝗰𝗵𝗲𝗰𝗸𝗼𝘂𝘁 𝗯𝗿𝗮𝗻𝗰𝗵𝗻𝗮𝗺𝗲: Switch to an existing branch.
𝟳. 𝗴𝗶𝘁 𝗰𝗼𝗺𝗺𝗶𝘁 --𝗮𝗺𝗲𝗻𝗱:Modify the last commit.
𝟴. 𝗴𝗶𝘁 𝗽𝘂𝘀𝗵 𝗼𝗿𝗶𝗴𝗶𝗻 𝗯𝗿𝗮𝗻𝗰𝗵
𝗻𝗮𝗺𝗲: Push a branch to a remote.
𝟵. 𝗴𝗶𝘁 𝗽𝘂𝗹𝗹: Fetch and merge remote changes.
𝟭𝟬. 𝗴𝗶𝘁 𝗿𝗲𝗯𝗮𝘀𝗲 -𝗶: Rebase interactively, rewrite commit history.
𝟭𝟭. 𝗴𝗶𝘁 𝗰𝗹𝗼𝗻𝗲: Create a local copy of a remote repo.
𝟭𝟮. 𝗴𝗶𝘁 𝗺𝗲𝗿𝗴𝗲: Merge branches together.
𝟭𝟯. 𝗴𝗶𝘁 𝗹𝗼𝗴 --𝘀𝘁𝗮𝘁: Show commit logs with stats.
𝟭𝟰. 𝗴𝗶𝘁 𝘀𝘁𝗮𝘀𝗵: Stash changes for later.
𝟭𝟱. 𝗴𝗶𝘁 𝘀𝘁𝗮𝘀𝗵 𝗽𝗼𝗽: Apply and remove stashed changes.
𝟭𝟲. 𝗴𝗶𝘁 𝘀𝗵𝗼𝘄 𝗰𝗼𝗺𝗺𝗶𝘁𝗶𝗱: Show details about a commit.
𝟭𝟳. 𝗴𝗶𝘁 𝗿𝗲𝘀𝗲𝘁 𝗛𝗘𝗔𝗗~𝟭: Undo the last commit, preserving changes locally.
𝟭𝟴. 𝗴𝗶𝘁 𝗳𝗼𝗿𝗺𝗮𝘁-𝗽𝗮𝘁𝗰𝗵 -𝟭 𝗰𝗼𝗺𝗺𝗶𝘁
𝗶𝗱: Create a patch file for a specific commit.
𝟭𝟵. 𝗴𝗶𝘁 𝗮𝗽𝗽𝗹𝘆 𝗽𝗮𝘁𝗰𝗵𝗳𝗶𝗹𝗲𝗻𝗮𝗺𝗲: Apply changes from a patch file.
𝟮𝟬. 𝗴𝗶𝘁 𝗯𝗿𝗮𝗻𝗰𝗵 -𝗗 𝗯𝗿𝗮𝗻𝗰𝗵𝗻𝗮𝗺𝗲: Delete a branch forcefully.
𝟮𝟭. 𝗴𝗶𝘁 𝗿𝗲𝘀𝗲𝘁: Undo commits by moving branch reference.
𝟮𝟮. 𝗴𝗶𝘁 𝗿𝗲𝘃𝗲𝗿𝘁: Undo commits by creating a new commit.
𝟮𝟯. 𝗴𝗶𝘁 𝗰𝗵𝗲𝗿𝗿𝘆-𝗽𝗶𝗰𝗸 𝗰𝗼𝗺𝗺𝗶𝘁
𝗶𝗱: Apply changes from a specific commit.
𝟮𝟰. 𝗴𝗶𝘁 𝗯𝗿𝗮𝗻𝗰𝗵: Lists branches.
𝟮𝟱. 𝗴𝗶𝘁 𝗿𝗲𝘀𝗲𝘁 --𝗵𝗮𝗿𝗱: Resets everything to a previous commit, erasing all uncommitted changes.

https://media.licdn.com/dms/image/v2/D4D22AQEW2JYFN6W2eA/feedshare-shrink_2048_1536/feedshare-shrink_2048_1536/0/1731133187260?e=1734566400&v=beta&t=X0_sLmELlil8EFWrtkaXrR1zbcDqPKJCcFtCwPlPWAE

Q4. from utils import * 가 추천되지 않는 이유?

단점

  1. 네임스페이스 오염
  • *를 사용하면 utils 모듈의 모든 함수와 변수가 현재 파일의 네임스페이스로 들어와 다른 모듈에서 동일한 이름을 가진 함수나 변수와 충돌할 가능성이 있다.
  1. 가독성 문제
  • main.py 에서 어떤 함수가 어디에서 왔는지 명확하지 않는다.
  • 코드 리뷰나 협업 시, get_table_info 와 같은 함수가 utils에서 온 것인지 아니면 다른 모듈에서 온 것인지 알기 어렵다.
  1. 자동 완성 제한
  • 많은 IDE에서 *로 가져온 함수는 자동 완성이나 코드 네비게이션을 제대로 지원하지 못함.

결론적으로 필요한 함수만 명시적으로 가져오는 방법이 훨씬 좋다.

# __init__.py
from .eda_utils import (
    get_table_info,
    color_table_by_column_unique_values,
    data_col_overview,
    read_csv,
    fill_unknown_values,
    apply_color,
)
# main.py
from utils import get_table_info, read_csv

df = read_csv('my_file')
print(get_table_info('my_table', engine))

구조 개선

  1. 모듈화
  • utils 폴더가 점점 커질 경우, 하위 모듈로 나누는 것이 좋다.
utils/
├── __init__.py
├── eda_utils.py        # EDA 관련 유틸리티
├── database_utils.py   # 데이터베이스 관련 유틸리티
├── plot_utils.py       # 시각화 관련 유틸리티
  1. init.py 에 주요 함수만 추가
  • 자주 사용하는 함수만 init.py 에 추가하고, 나머지는 개별 모듈에서 임포트한다.
# __init__.py
from .eda_utils import get_table_info, read_csv  # 자주 사용하는 함수만 추가
  1. 직접 모듈에서 임포트
  • 자주 사용하지 않는 함수는 main.py 에서 직접 모듈을 통해 임포트 한다.
from utils.eda_utils import fill_unknown_values

최종 구조 예시

project/
├── main.py                 # Main script
├── utils/                  # Utility package
│   ├── __init__.py         # Package initializer
│   ├── eda_utils.py        # EDA utilities
│   ├── database_utils.py   # Database utilities
│   ├── plot_utils.py       # Visualization utilities
└── data/                   # Data folder
    └── my_file.csv         # Example data file

차이점 설명

차이점
from .eda_utils import read_csv
from utils.eda_utils import read_csv

  1. from .eda_utils import read_csv(상대경로 import)
  • 의미
    • .은 현재 모듈이 속한 폴더(즉, 같은 패키지 내)
    • eda_utils 는 init.py와 같은 폴더 내 존재
  • 용도
    • 패키지 내부에서 다른 모듈을 참조할 때 사용
    • 예를 들어, init.py 파일 내부에서 같은 폴더 내 eda_utils.py 에 있는 함수를 가져올 때 사용
  • 제약
    • 반드시 패키지 내부에서 실행 될 때만 동작
    • 즉, 패키지의 루트 경로에서 실행되는 경우만 유효
    • 예를 들어, python main.py를 프로젝트 루트에서 실행해야 정상적으로 작동
  1. from utils.eda_utils import read_csv (절대 경로 Import)
  • 의미
    • utils 는 프로젝트의 루트 디렉토리에서 시작하는 절대경로
    • eda_utils는 utils 폴더 내에 있는 파일을 가리킨다.
  • 용도
    • 루트 디렉토리를 기준으로 패키지를 임포트 할 ㄷ때
    • 프로젝트의 모든 스크립트 파일에서 일관되게 사용
    • 경로가 명확하므로 가독성 높고, 디렉토리 구조 변경 시 유연
  • 장점
    • 유지보수 용이
  1. 언제 각각 사용할까?
  • from .eda_utils import read_csv
    • 같은 패키지 내에서 다른 모듈 참조
    • 예) init.py 파일 내부에서 eda_utils.py 접근
  • from utils.eda_utils import read_csv
    • 프로젝트 외부의 스크립트(main.py)에서 유틸리티 함수 사용
    • 프로젝트의 루트 경로를 기준으로 명확한 경로를 사용해야 할 때
  • 패키지 내부에서 모듈 간 참조에는 상대 경로(.)를 사용하는 것이 적합합니다.
  • 프로젝트 루트에서 임포트하거나 외부 스크립트에서 사용할 경우 절대 경로(utils.eda_utils)를 사용하는 것이 더 명확하고 관리하기 쉽습니다.

0개의 댓글