PEP 8

v K_Y v·2023년 8월 31일
0

PYTHON

목록 보기
2/2
post-thumbnail

PEP 8이란?

PyCharm이 알려줄 때 말을 잘 듣도록 하자...

"Python Enhancement Proposal 8"

  • PEP는 파이썬 개선 제안의 약자로 파이썬이나 그 프로세스 또는 환경에 대한 새로운 기능이나 규칙을 제안하는 문서입니다.
  • 그중 PEP 8은 파이썬 프로그래밍 언어의 코딩 스타일 가이드라인을 정의한 문서로 코드의 가독성을 향상시키기 위해 따라야 할 규칙과 권장 사항을 제시하고 있습니다.
  • 가독성과 일관성을 위해 지켜져야하는 규칙

Code Lay-out

Indentation

  • 들여쓰기에 4개의 스페이스를 사용하여햐 합니다.
  • 들여쓰기는 탭이 아닌 스페이스를 기본 원칙으로한다.
  • 괄호 및 괄호 안의 괄호와 같이 연결되는 라인에서 줄바꿈이 일어나는 요소들은 수직으로 정렬되어야 합니다.

Good

# 괄호로 정렬되는 경우
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# 다른 요소와 구분을 위해 더 많은 들여쓰기를 한 경우
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

# 매달린 형태의 들여쓰기는 하나의 들여쓰기 레벨을 추가해야함
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

Bad

# 수직정렬이 되지 않았을 경우, 첫번째 줄에는 인수가 없어야함
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# 다른 요소와 구분이 되지 않는 경우
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

Indentation - if / 닫는 괄호

  • if문이 길 경우는 if문 내의 코드와 충돌할 가능성이 있습니다. PEP 8에서는 이에 대해 몇가지 베스트 옵션을 제공합니다.
  • 닫는 괄호의 경우는 마지막 줄의 첫번째 요소 혹은 공백 없이 라인의 가장 앞에 위치합니다.

Good - if

# 들여쓰기 없는 경우
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# if문 내 코드와 구분하기 위한 주석 추가
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# 추가적인 들여쓰기
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

Good - 괄호

# 마지막 줄의 첫번째 요소에 위치
my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

# 라인의 가장 앞에 위치
my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

Maximum Line Length

  • 한 줄의 최대 길이를 79자로 제한합니다. (상황에 따라 99자까지 허용하기도…)
  • docstrings나 comments 처럼 긴 텍스트는 한 줄의 최대 길이를 72자로 제한합니다.
  • 백슬래시를 활용해 줄바꿈을 합니다.

Should a Line Break Before or After a Binary Operator?

  • 이전에는 이항연산자 후에 줄바꿈을 하는 방식이 추천되었으나, 수학자들의 전통을 따라 이항연산자 전에 줄바꿈을 하는 것을 추천합니다.

Good

income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Blank Lines

  • 클래스 정의와 함수 정의 사이에는 두 개의 공백 라인을 사용하여 구분하고 있습니다.
  • 클래스 내부의 메서드 정의는 단일한 공백 라인으로 구분하고 있습니다.
  • 관련 함수 그룹을 구분하기 위해 빈 줄을 추가로 사용할 수 있습니다
class Calculator:

    def __init__(self) -> None:
        self.value: int = 0

    def add(self, x: int, y: int) -> int:
        return x + y

    def subtract(self, x: int, y: int) -> int:
        return x - y


def main() -> None:
    calc = Calculator()

    result1 = calc.add(5, 3)
    print("Addition result:", result1)

    result2 = calc.subtract(10, 4)
    print("Subtraction result:", result2)


if __name__ == "__main__":
    main()

import

  • import는 행으로 구분되어 사용되어야 합니다.
  • import는 아래와 같이 그룹화 하도록 합니다.
    - 표준 라이브러리 import
    - 관련된 서브파티 import
    - 로컬 어플리케이션 / 자체 라이브러리 import
    - ** 위 그룹 사이에는 빈 줄을 넣는 것이 좋다
  • 원칙적으로 Absolute import가 권장되며 wildcard import는 지양해야 합니다.

Module Level Dunder(Double under) Names

  • Dunder 모듈의 경우는 닥스트링 뒤, from future import barry_as_FLUFL 을 제외하고 import문 전에 쓰여져야 합니다.
"""This is the example module.
This module does stuff.
"""

from __future__ import barry_as_FLUFL

__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'

import os
import sys

Whitespace in Expressions and Statements

  • 아래 같은 상황에서 관계없는 공백은 피하도록 합니다.
  • 후행공백은 지양합니다.
spam( ham[ 1 ], { eggs: 2 } ) 
  => spam(ham[1], {eggs: 2})
bar = (0, ) 
  => foo = (0,)
if x == 4 : print(x , y) ; x , y = y , x
  => if x == 4: print(x, y); x, y = y, x
  • 이진연산자 주변은 공백을 추가하도록 합니다.
  • 다른 우선순위의 연산자가 함께 쓰인다면, 가장 우선순위가 낮은 연산자 주변에 공백을 추가하는 것을 고려합니다.
i=i+1
  => i = i + 1
submitted +=1
  => submitted += 1
x = x * 2 - 1
  => x = x*2 - 1
hypot2 = x * x + y * y
  => hypot2 = x*x + y*y
c = (a + b) * (a - b)
  => c = (a+b) * (a-b)
  • 키워드 독립변수 혹은 기본 파라미터 값을 나타내기 위해 = 주변에 스페이스를 사용을 지양합니다.
  • type hint와 기본 파라미터 값을 같이 쓸 경우는 = 주변에 스페이스를 사용합니다.
# Good
def complex(real, imag=0.0):
    return magic(r=real, i=imag)
    
# Bad
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)
    
# argument annotation with a default value

# Good
def munge(sep: AnyStr = None): ...
def munge(input: AnyStr, sep: AnyStr = None, limit=1000): ...

# Bad
def munge(input: AnyStr=None): ...
def munge(input: AnyStr, limit = 1000): ...

Comment

  • 코드와 반대되는 주석은 없는 것보다 못합니다.
  • 첫번째 글자는 특수한 경우를 제외하고 대문자로 적도록 합니다.
  • 마지막 문장을 제외하곤 문장의 끝에 두개의 스페이스를 사용하도록 합니다.
  • 가능한 주석을 영어로 작성하도록 합니다.
  • 인라인주석은 가능한 자제합니다.
  • 인라인주석은 소스로부터 최소 2개의 스페이스로 구분되어야 합니다.

Documentation Strings

  • 모든 public 모듈, 함수, 클래, 메소드에 대해 닥스트링을 작성합니다.
  • Non-public 메소드에 대해서는 닥스트링이 필요하진 않지만, 메소드가 어떤 역할인지 설명하는 주석을 기재해야하고 이 주석은 def 라인 다음에 위치해야 한다.
  • 여러줄로 구성된 닥스트링을 끝내는 마지막 따옴표는 혼자 있어야합니다. 만약 한줄로 작성된다면 같은 줄에 위치해도 됩니다.
# Google version
class Calculator:
    """
    Contains various functions to perform common 
    mathematical operations between two numbers
     
    Attributes:
        prevSum (int): Stores value of previous operation
    """
 
    def __init__(self):
        """
        Initializes class attributes
         
        Args:
            No arguments
        """
 
        self.prevSum = 0
 
    def add(num1, num2):
        """
        Calculate sum of two numbers
         
        Args:
            num1 (int): First Value
            num2 (int): Second Value
             
        Returns:
            Sum of num1 and num2
        """
 
        return num1 + num2

to be continue...

profile
📌 기억하기 위해 남기는 기록들

0개의 댓글