Akashic Records

PEP(Python Enhancement Proposal) 8 본문

Python for Beginners

PEP(Python Enhancement Proposal) 8

Andrew's Akashic Records 2024. 5. 28. 14:15
728x90

Python for beginner

 

PEP 8은 파이썬 코드를 작성할 때 따르는 스타일 가이드입니다. PEP는 Python Enhancement Proposal의 약자로, 파이썬 개발 과정에서 새로운 기능을 제안하거나 기존 표준을 개선하기 위한 제안을 의미합니다. PEP 8은 파이썬 코드의 가독성을 높이고, 파이썬 커뮤니티 사이에서 일관된 코딩 스타일을 적용하기 위해 만들어졌습니다. Guido van Rossum, 파이썬의 창시자, 그리고 Barry Warsaw, Nick Coghlan 등이 작성한 이 문서는 파이썬 코드를 어떻게 작성해야 하는지에 대한 기준을 제공합니다.

PEP 8의 주요 내용

1. 코드 레이아웃

  • 들여쓰기: 4개의 공백을 사용하고, 탭은 사용하지 않습니다.
  • 최대 줄 길이: 한 줄은 최대 79자까지 사용하도록 권장합니다.
  • 공백의 사용: 괄호, 중괄호, 대괄호 내부에는 불필요한 공백을 넣지 않습니다. 쉼표, 콜론, 세미콜론 앞에는 공백을 넣지 않고, 뒤에는 한 칸을 띄웁니다.
  • import 문: 각 import 문은 별도의 줄에 작성합니다. 표준 라이브러리 모듈, 관련 외부 모듈, 로컬 모듈 순서로 그룹화하고, 각 그룹은 한 줄을 띄워 구분합니다.
  • 행의 끝: 불필요한 공백(행의 끝에 있는 공백)은 피해야 합니다.
  • 비어 있는 줄: 함수와 클래스를 구분할 때는 두 줄을 비워 두고, 클래스 내의 메서드 정의는 한 줄을 비워 둡니다. 모듈 수준의 함수나 글로벌 코드는 두 줄을 비워 구분합니다.
  • 소스 파일 인코딩: UTF-8 또는 ASCII를 사용해야 합니다.

2. 명명 규칙

  • 함수명: 소문자와 언더스코어를 사용하여 정의합니다. 예: my_function
  • 변수명: 소문자와 언더스코어를 사용합니다.
  • 클래스명: 카멜케이스를 사용하여 정의합니다. 예: MyClass
  • 상수: 모든 글자를 대문자와 언더스코어로 구성합니다. 예: MY_CONSTANT
  • 비공개 속성: 언더스코어 두 개로 시작합니다. 예: __private_var
  • 언더스코어의 사용: 함수, 변수, 메서드에 대해 한 개의 선행 언더스코어는 비공개를 의미하며, 선행 더블 언더스코어는 클래스 내부에서만 사용할 메서드나 속성을 의미합니다 (이는 파이썬의 이름 맹글링 때문입니다).
  • 매직 메서드: __like_this__ 형식은 시스템 정의 이름에만 사용되므로 사용자 정의 이름에는 사용하지 않도록 권장됩니다.

3. 프로그래밍 권장 사항

  • 코드 비교: None을 비교할 때는 ==가 아닌 is를 사용합니다.
  • 불필요한 세미콜론: 파이썬 코드에서 세미콜론을 사용하지 않도록 권장합니다.
  • 타입 힌트: PEP 484에 따라 타입 힌트를 사용하여 함수의 매개변수와 반환값의 타입을 명시할 수 있습니다.
  • Boolean 값 비교: ==를 사용하여 Boolean 값을 비교하는 대신 if cond:를 사용합니다.
  • 타입 비교: 객체의 타입을 비교할 때 type() 대신 isinstance()를 사용합니다. 이는 서브클래스도 고려하기 때문입니다.
  • 헤더 파일의 관례: 스크립트의 맨 위에는 shebang 라인, 파일의 인코딩, docstring, 임포트 순으로 작성합니다.

▶  해더 파일 관례 추가설명

파이썬 스크립트의 상단에 배치되는 정보를 말합니다. 일반적으로 스크립트 맨 위에는 다음과 같은 요소들을 포함하는 것이 좋습니다:

  1. Shebang 라인: 스크립트를 직접 실행할 수 있는 환경에서 적절한 파이썬 인터프리터를 지정합니다.
  2. 파일 인코딩: 스크립트 파일의 문자 인코딩을 명시합니다.
  3. 모듈 독스트링: 모듈의 목적이나 동작을 설명하는 문서화 문자열입니다.
  4. 임포트: 필요한 모듈들을 불러옵니다.

다음은 이러한 요소들을 포함한 파이썬 스크립트의 해더 예시입니다:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
This module provides utilities for performing calculations
related to geometry, such as calculating the area of circles
and rectangles.

Example:
    This script can be run with the following command:

    $ python geometry_utils.py

Attributes:
    PI (float): approximation of pi used in calculations.
"""

import math
import sys

# 모듈 레벨 상수
PI = 3.14159

def circle_area(radius):
    """Calculate the area of a circle given its radius.

    Args:
        radius (float): The radius of the circle.

    Returns:
        float: The area of the circle.
    """
    return PI * (radius ** 2)

def rectangle_area(width, height):
    """Calculate the area of a rectangle given its width and height.

    Args:
        width (float): The width of the rectangle.
        height (float): The height of the rectangle.

    Returns:
        float: The area of the rectangle.
    """
    return width * height

if __name__ == "__main__":
    # Example usage
    print(f"Circle Area (radius 5): {circle_area(5)}")
    print(f"Rectangle Area (5x10): {rectangle_area(5, 10)}")

 

설명:

  1. Shebang Line (#!/usr/bin/env python3): 이 라인은 스크립트가 직접 실행될 때 사용할 파이썬 인터프리터의 경로를 제공합니다. env를 사용하면 시스템의 PATH에서 python3을 찾아 사용합니다.
  2. 인코딩 선언 (# -*- coding: utf-8 -*-): 이 라인은 파이썬 인터프리터에게 스크립트 파일이 UTF-8 인코딩을 사용한다고 알려줍니다. 파이썬 3.x에서는 기본적으로 UTF-8을 사용하지만, 명시적으로 선언해주는 것이 좋습니다.
  3. Docstring: 모듈의 주요 기능과 사용 방법에 대한 설명을 포함합니다. 여기에는 예시 사용법, 모듈에 대한 간략한 설명, 모듈에서 사용하는 주요 속성이나 변수에 대한 설명이 포함될 수 있습니다.
  4. Imports: 필요한 외부 모듈과 패키지를 불러옵니다.

이러한 구성은 파이썬 스크립트를 다른 개발자들이 쉽게 이해하고 사용할 수 있게 도와줍니다.

 

▶ PEP 484는 파이썬에서 타입 힌트

 파이썬 3.5부터 공식적으로 지원되기 시작했습니다. 타입 힌트는 개발자가 변수, 함수의 매개변수, 그리고 함수의 반환 값에 대한 예상 타입을 명시할 수 있게 해주어 코드의 명확성을 높이고, 에러를 미리 방지하며, 더 나은 도구 지원을 가능하게 합니다.

 

타입 힌트의 주요 목적

타입 힌트는 주로 다음을 위해 사용됩니다:

  1. 코드 가독성 향상: 코드를 처음 보는 사람이 변수나 함수가 어떤 타입의 데이터를 기대하는지 쉽게 이해할 수 있습니다.
  2. 정적 분석 도구 지원: mypy, PyCharm, Visual Studio Code 등의 IDE나 도구들이 코드의 오류를 더 잘 찾아낼 수 있도록 돕습니다.
  3. 코드 품질 개선: 타입 체크를 통해 런타임에 발생할 수 있는 타입 관련 오류를 사전에 방지할 수 있습니다.

타입 힌트의 사용 예

타입 힌트는 변수 선언, 함수의 매개변수, 함수의 반환 값에 적용할 수 있습니다. 다음은 몇 가지 예시입니다.

 

기본 사용법

def add_numbers(a: int, b: int) -> int:
    return a + b

name: str = "Alice"
age: int = 30

 

리스트, 딕셔너리 등의 컬렉션에 대한 힌트

from typing import List, Dict, Tuple

def process_items(items: List[str]) -> None:
    for item in items:
        print(item)

def age_mapping(names: List[str], ages: List[int]) -> Dict[str, int]:
    return dict(zip(names, ages))

coordinates: Tuple[int, int, int] = (10, 20, 30)

 

선택적 값과 유니언 타입

from typing import Optional, Union

def greet(name: Optional[str] = None) -> str:
    if name is not None:
        return f"Hello, {name}"
    return "Hello, Guest"

def log_level(level: Union[int, str]) -> None:
    print(f"Logging level: {level}")

 

복잡한 구조

from typing import Dict, List

def process_school(school_data: Dict[str, List[int]]) -> None:
    for student, scores in school_data.items():
        average = sum(scores) / len(scores)
        print(f"{student}: {average:.2f}")

 

주의사항

  • 타입 체크는 선택적: 파이썬은 동적 타입 언어이므로, 타입 힌트는 강제적이지 않습니다. 실행 시간에 타입 오류를 발생시키지 않으며, 주로 도구 지원과 가독성을 위해 사용됩니다.
  • 성능에 영향 없음: 타입 힌트는 파이썬의 실행 속도에 영향을 주지 않습니다. 타입 체크를 위한 별도의 프로세스가 실행 시간에 수행되지 않기 때문입니다.

PEP 484와 타입 힌트는 파이썬 코드의 질을 개선하고, 대규모 프로젝트의 관리를 용이하게 하는 중요한 도구입니다. 타입 힌트를 적절히 사용하면 코드의 안정성과 유지보수성이 크게 향상됩니다.

4. 주석

  • 블록 주석: 각 주석 라인은 #과 한 칸 띄우고 시작합니다.
  • 인라인 주석: 코드와 같은 줄에 작성되며, 코드 끝과 주석 사이에 최소 두 칸의 공백을 둡니다.

5. 임포트

  • 임포트 스타일: 관련된 항목들은 함께 임포트하고, 권장되는 순서는 표준 라이브러리, 관련 서드 파티 라이브러리, 로컬 애플리케이션/라이브러리 순입니다.
  • 임포트 위치: 모든 import 문은 모듈의 상단에 위치해야 하고, 모듈 주석과 docstrings 다음에 위치해야 합니다.
  • 와일드카드 임포트 금지: from module import *의 사용을 피해야 합니다. 이는 네임스페이스를 오염시킬 수 있으며, 어떤 이름들이 현재 네임스페이스에 존재하는지 명확하게 하지 못합니다.

 

▶ 파이썬 네이밍 규칙 추가설명

코드의 가독성과 유지 보수성을 높이는 중요한 요소입니다. 파이썬의 공식 스타일 가이드인 PEP 8에는 변수, 함수, 클래스 등에 대한 명명 규칙이 자세히 설명되어 있습니다. 여기에 몇 가지 기본적인 파이썬 네이밍 규칙을 정리해보겠습니다.

일반 규칙

  • 명확하고 간결하게: 변수 이름은 그 변수가 무엇을 의미하는지 쉽게 이해할 수 있도록 명확하고 간결하게 지어야 합니다.
  • 소문자 사용: 파이썬에서는 일반적으로 변수와 함수 이름에 소문자를 사용합니다.
  • 밑줄 사용: 단어와 단어 사이에는 밑줄(_)을 사용하여 구분합니다 (예: my_variable).
  • 비공개/내부용 변수: 언더스코어로 시작하는 이름 (예: _internal 또는 __private)은 모듈 내부 또는 클래스 내부에서만 사용할 것을 의미합니다. 더블 언더스코어를 사용하는 것은 클래스의 속성을 맹글링하기 위해 사용됩니다.

변수 이름

  • 소문자와 언더스코어를 사용하여 표현합니다.
  • 예시: user_name, inventory_list

함수 이름

  • 함수 이름도 변수 이름과 마찬가지로 소문자와 언더스코어를 사용합니다.
  • 예시: calculate_age, save_profile

클래스 이름

  • 클래스 이름은 대문자로 시작하는 카멜케이스(CapWords)를 사용하여 정의합니다.
  • 예시: Car, UserAccount

상수 이름

  • 상수는 모든 문자를 대문자로 하고, 단어 사이를 언더스코어로 구분합니다.
  • 예시: MAX_SPEED, TOTAL_COUNT

모듈 이름

  • 모듈 이름은 짧은 소문자로 구성되며, 필요에 따라 밑줄을 사용할 수 있습니다.
  • 예시: utils, data_processing

패키지 이름

  • 패키지 이름 역시 모듈과 같이 짧은 소문자를 사용합니다. 밑줄 사용을 피하는 것이 일반적입니다.
  • 예시: package, mypackage

네이밍 규칙을 일관되게 유지하는 것은 코드를 읽고 이해하는 데 중요합니다. 코드가 공개적인 프로젝트에 기여할 경우나 여러 사람이 작업하는 프로젝트의 경우, PEP 8이나 해당 프로젝트의 스타일 가이드를 따르는 것이 좋습니다.

728x90
Comments