python #1 기본문법, 가상환경, 로깅

python #1 기본문법, 가상환경, 로깅 #

#2025-08-12


1. 기본문법 #

#1 break와 continue의 차이 (p.29)

# break
for i in range(10):
    if i==5:
        break
    print(i)

# continue
for i in range(5):
    if i==2:
        continue
    print(i)
  • break
    • 0부터 9까지 세는 반복문에서 i가 5가 되는 순간 break를 만나면 그 뒤의 숫자는 전혀 세지 않고 반복이 끝난다.
  • continue
    • 0부터 4까지 세는 반복문에서 i가 2인 경우 continue를 만나면 2를 출력하지 않고 바로 다음 숫자인 3으로 넘어가고 반복문 자체는 끝나지 않는다.

#

#2 가변 인자 (p.78)

image
  • *args는 인자들을 하나의 튜플로 묶어서 받는다.
  • **kwargs는 인자들을 하나의 딕셔너리로 묶어서 받는다.
  • mix_example(a, b, *args, **kwargs)일때 mix_example(1, 2, 3, 4, 5, name="철수", age=30)
    • 1과 2는 매개변수 a와 b에 저장
      • a:1, b:2
    • 3, 4, 5는 args라는 튜플에 저장
      • args: (3,4,5)
    • name=“철수"와 age=30은 kwargs라는 딕셔너리에 저장
      • kwargs: {’name’:‘철수’, ‘age’:30}

#

#3 클로저 (p.86)

def multiplier(factor):
    def multiply(x):
        return x*factor
    return multiply

double = multiplier(2)
print(double(10)) #20
  1. multiplier(2)를 호출
  2. factor가 2로 고정된 multiply 함수가 만들어짐.
  3. 이 함수는 나중에 호출해도 2라는 값을 기억하고 있다.
  4. double(10)을 하면 10에 2를 곱한 20이 나온다.

#

2. 가상환경 #

#1 지금 환경을 그대로 뜨는 방법 (p.109)

  • pip freeze > requirements.txt를 하면 현재 환경에 설치된 모든 패키지와 그 버전이 기록되고
  • 다른 환경에서 똑같은 설정을 만들고 싶다면 pip install -r requirements.txt를 실행하면 된다.

#

#2 .env (p.115)

image
  • 데이터베이스 비밀번호나 API 키처럼 코드에 직접 적으면 안 되는 값들은 .env라는 파일에 따로 저장하고 코드에서는 이 파일을 읽어서 사용하는 것이 안전하다.
  • 사용법
    • from dotenv import load_dotenv로 불러오고
    • load_dotenv()를 실행하면 .env 파일 안의 값들이 환경 변수로 등록된다.
    • os.getenv(“DB_USER”)로 필요한 값을 꺼낼 수 있다.
  • 깃허브에 올릴때는 gitignore에 넣어야된다.

#

3. Logging 실습 #

문제

LOG_LEVEL=DEBUG
APP_NAME=MyCoolApp

.env를 위와같이 작성했을때 app.log에 다음 로그 출력하기

  • INFO 레벨 메시지: “앱 실행 시작”
  • DEBUG 레벨 메시지: “환경 변수 로딩 완료”
  • ERROR 레벨 메시지: ZeroDivisionError 예외 발생 시 출력

#

코드

import os
import logging
from logging import StreamHandler, FileHandler
from dotenv import load_dotenv

def configure_logging(level, filename="app.log"): # 로그 파일명: app.log
    """
    콘솔과 파일 모두에 로그를 출력하는 함수
    """
    fmt = "%(asctime)s [%(levelname)s] %(message)s" # 로그 포맷: 시간 | 로그레벨 | 메시지
    formatter = logging.Formatter(fmt, "%Y-%m-%d %H:%M:%S")
    
    # 로그 출력
    sh = StreamHandler() # 콘솔 출력 핸들러 생성
    sh.setFormatter(formatter) 

    fh = FileHandler(filename, encoding="utf-8") # 파일 출력 핸들러 생성
    fh.setFormatter(formatter)

    logging.basicConfig(level=level, handlers=[sh, fh]) # 콘솔 + 파일 동시에 출력되도록 핸들러 구성

def main():
    # 1) .env 파일 로드
    load_dotenv()

    # 2) 환경 변수에서 로그 레벨과 앱 이름 읽기
    log_level = getattr(logging, os.getenv("LOG_LEVEL"), logging.INFO) # .env에서 LOG_LEVEL을 읽어오기
    app_name = os.getenv("APP_NAME", "MyApp") # .env에서 APP_NAME을 읽어오기

    # 3) 로깅 설정 적용
    configure_logging(log_level) # configure_logging 함수: 콘솔 + 파일(app.log) 두 군데에 동시에 로그가 찍히도록 핸들러를 구성.

    # 4) 로그 메시지 출력
    logging.info("앱 실행 시작")  # INFO 레벨
    logging.debug(f"환경 변수 로딩 완료 (APP_NAME={app_name})")  # DEBUG 레벨

    # 5) 예외 발생 예시
    try:
        1 / 0  # ZeroDivisionError
    except ZeroDivisionError:
        logging.error("예외 발생 예시", exc_info=True) # ERROR 레벨로 예외 메시지와 스택 트레이스 출력

if __name__ == "__main__":
    # main() 함수 실행
    main()

#

결과

#app.log

2025-08-12 17:13:40 [INFO] 앱 실행 시작
2025-08-12 17:13:40 [DEBUG] 환경 변수 로딩 완료 (APP_NAME=MyCoolApp)
2025-08-12 17:13:40 [ERROR] 예외 발생 예시
Traceback (most recent call last):
  File "/Users/yshmbid/Documents/home/github/Data-MLOps/env_logging_example/main.py", line 43, in main
    1 / 0  # ZeroDivisionError
    ~~^~~
ZeroDivisionError: division by zero

#