Python PEP 8(Python Enhancement Proposal # 8) 스타일 가이드

Minsang Yu·2023년 5월 28일
0

1. PEP 8 스타일 가이드를 따르라.

파이썬 개선제안 #8(Python Enhancement Proposal #8)은 파이썬 코드를 어떤 형식으로 작성할지 알려주는 스타일 가이드다.

이런 일관된 스타일을 사용하면 코드에 더 친숙하게 접근하고, 코드를 더 쉽게 읽을 수 있다.

공백

파이썬에서 공백은 가독성을 높이고 코드를 보다 명확하게 작성하기 위해 사용됩니다.

  • 탭 대신 스페이스를 사용해 들여쓰기를 하라
for i in range(len(n)):
 print(i)
  • 문법적으로 중요한 들여쓰기에는 4칸 스페이스를 사용

if condition:
    statement # 4 space
  • 라인 길이는 79개 문자 이하여야 한다.
  • 긴 식을 다음줄에 이어서 쓸 경우에는 일반적인 들여쓰기 보다는 4스페이스를 더 들여써야 한다.
  • 파일 안에서 각 함수와 클래스 사이에는 빈 줄을 두 줄 넣어라.
def a():
    pass
#
# 공백 2칸 
def b():
    pass
#
#
class CLS_c:
  • 클래스 안에서 메서드와 메서드 사이에는 빈 줄을 한 줄 넣어라
class d:
    def func1():
        pass
# 공백 1칸 
    def func2():
        pass
  • 딕셔너리에서 키와 콜론(:) 사이에는 공백을 넣지 않고, 한 줄 안에 키와 값을 같이 넣는 경우에는 콜론 다음에 스페이스를 하나 넣는다.
article = { 'title': 'jackson', 'age': 21 }
  • 타입 표기를 덧붙이는 경우에는 변수 이름과 콜론 사이에 공백을 넣지 않도록 주의하고, 콜론과 타입 정보 사이에는 스페이스를 넣어라
title: String
age: int
TF: boolean

명명 규약

PEP8은 파이썬 언어의 여러 부분에 사용하는 이름을 어떻게 붙일지에 대한 고유 스타일을 제공한다.

  • 함수, 변수, 애트리뷰트는 lowercase_underscore처럼 소문자와 밑줄을 사용해야한다.
user_name = "John Doe"
age = 25

def calculate_area(length, width):
    return length * width
  • 보호해야 하는 인스턴스 애트리뷰트는 일반적인 애트리뷰트 이름 규칙을 따르되, leading_underscore처럼 밑줄로 시작한다.
class MyClass:
    def __init__(self):
        self._protected_attribute = 10
        self.public_attribute = 20

    def _protected_method(self):
        # 보호되어야 할 메서드 내용
        pass

    def public_method(self):
        # 공개 메서드 내용
        pass
  • 비공개(private) (한 클래스 안에서만 쓰이고 다른 클래스에서는 쓰이면 안되는 애트리뷰트) 인스턴스 애트리뷰트는 일반적인 애트리뷰트 이름 규칙을 따르되, __leading_underscore처럼 밑줄 두 개로 시작한다.
class MyClass:
    def __init__(self):
        self.__private_attribute = 10

    def __private_method(self):
        # 비공개 메서드 내용
        pass

    def public_method(self):
        # 공개 메서드 내용
        pass
  • 클래스(예외도 포함)는 CapitalizedWord처럼 여러 단어를 이어 붙이되, 각 단어의 첫 글자를 대문자로 만든다.
class MyClass:
    pass

class MyException(Exception):
    pass

class MyCustomClass:
    pass
  • 모듈 수준의 상수는 ALL_CAPS처럼 모든 글자를 대문자로 하고단어와 ㄷ단어 사이를 밑줄로 연결한 형태를 사용한다.
MY_CONSTANT = 10
MAX_SIZE = 100
PI_VALUE = 3.14
  • 클래스에 들어있는 인스턴스 메서드는 호출 대상 객체를 가리키는 첫번쨰 인자의 이름으로 반드시 self 를 사용해야한다.
class MyClass:
    def instance_method(self):
        # self를 사용하여 인스턴스 속성에 접근 가능
        self.some_attribute = 10
        print("This is an instance method.")

my_obj = MyClass()
my_obj.instance_method()
  • 클래스 메서드는 클래스를 가리키는 첫 번쨰 인자의 이름으로 반드시 cls를 사용해야한다.
class MyClass:
    @classmethod
    def class_method(cls):
        # cls를 사용하여 클래스 속성에 접근 가능
        cls.some_attribute = 10
        print("This is a class method.")

MyClass.class_method()

카멜케이스와 스네이크 케이스
카멜 케이스(CamelCase)와 스네이크 케이스(Snake_case)는 두 가지 일반적인 네이밍 스타일로서 변수, 함수, 클래스 등의 이름을 작성할 때 사용됩니다. 각각의 특징과 사용 예시를 비교해보겠습니다:

카멜 케이스 (CamelCase):

  • 각 단어의 첫 글자를 대문자로 작성하고, 나머지 글자는 소문자로 작성합니다.
  • 단어 사이를 붙일 때 대문자를 사용하여 단어를 구분합니다.
  • 주로 클래스 이름에 사용되며, 클래스 이름을 더 명확하고 가독성 있게 만듭니다.

예시: MyClass, calculateArea, isUserLoggedIn

스네이크 케이스 (snake_case):

  • 모든 글자를 소문자로 작성합니다.
  • 단어 사이를 밑줄(underscore)로 구분합니다.
  • 주로 변수, 함수, 모듈, 파일명 등에 사용되며, 가독성을 높이고 단어를 명확하게 구분합니다.

예시: my_variable, calculate_area, is_user_logged_in

두 케이스 스타일 모두 코드 작성자의 개인적인 취향과 팀 또는 프로젝트의 컨벤션에 따라 선택될 수 있습니다. 중요한 점은 일관성을 유지하는 것입니다. 프로젝트에서 선택한 스타일을 따라 코드를 일관되게 작성하면 가독성을 향상시키고 협업이 원활해집니다. PEP 8에서는 스네이크 케이스를 변수, 함수, 모듈 등의 이름 작성에 권장하고 있지만, 클래스의 경우 카멜 케이스를 사용하는 것을 권장하고 있습니다.

식과 문

‘파이썬의 선’ 에서는 문제를 해결할 명백한 방법이 하나 있으면, 가급적이면 유일해야 한다고 언급한다. PEP 8은 이런 가르침을 따라 식과 문장을 작성 하는 스타일 규칙을 다음과 같이 정했다.

  • 긍정적인 식을 부정하지 말고 (if not a is b) 부정을 내부에 넣어라 (if a is not b)
# 잘못된 예:
if not a is b:
    # 코드 내용

# 올바른 예:
if a is not b:
    # 코드 내용
  • 빈 컨테이너(container)나 시퀸스(sequence) ( []나 ‘ ‘ 등)를 검사할 떄는 길이를 0과 비교 (if len(something) == 0) 하지말라. 빈 시킨스나 컨테이너는 암묵적으로 False 취급된다는 사실을 활용해 ‘ if not 컨테이너’라는 조건문을 사용하라
my_list = []
my_dict = {}
my_string = ""

# 잘못된 예:
if len(my_list) == 0:
    # 리스트가 비어있을 때 수행할 작업

if len(my_dict) == 0:
    # 딕셔너리가 비어있을 때 수행할 작업

if len(my_string) == 0:
    # 문자열이 비어있을 때 수행할 작업

# 올바른 예:
if not my_list:
    # 리스트가 비어있을 때 수행할 작업

if not my_dict:
    # 딕셔너리가 비어있을 때 수행할 작업

if not my_string:
    # 문자열이 비어있을 때 수행할 작업
  • 비어 있지 않은 컨테이너나 시퀸스([1] 이나 ‘hi’)를 검사할 떄도 길이가 0보다 큰 지 검사하지 말라, 대신 if 컨테이너가 비어 있지 않는 경우 암묵적으로 Tru로 평가된다는 사실을 활용하라
my_list = [1, 2, 3]
my_string = "hi"

# 잘못된 예:
if len(my_list) > 0:
    # 리스트가 비어있지 않은 경우 수행할 작업

if len(my_string) > 0:
    # 문자열이 비어있지 않은 경우 수행할 작업

# 올바른 예:
if my_list:
    # 리스트가 비어있지 않은 경우 수행할 작업

if my_string:
    # 문자열이 비어있지 않은 경우 수행할 작업
  • 한 줄짜리 if 문이나 한 줄 짜리 for, while 루프, 한 줄짜리 except 복합문을 사용하지 말라, 명확성을 위해 각 부분을 여러 줄에 나눠 배치하라
# 잘못된 예:
if condition: do_something()

# 잘못된 예:
for item in my_list: process(item)

# 잘못된 예:
try: do_something()
except SomeException: handle_exception()

# 올바른 예:
if condition:
    do_something()

# 올바른 예:
for item in my_list:
    process(item)

# 올바른 예:
try:
    do_something()
except SomeException:
    handle_exception()
  • 식을 한 줄 안에 다 쓸수 없는 경우, 식을 괄호로 둘러싸고 줄바꿈과 들여 쓰기를 추가해서 읽기 쉽게 만들라
# 잘못된 예:
result = (value1 + value2 - value3 * value4 + value5) / (value6 + value7) - value8

# 올바른 예:
result = (
    (value1 + value2 - value3 * value4 + value5) /
    (value6 + value7) - value8
)

# 잘못된 예:
is_valid = (input_value > 0 and input_value < 10) or (input_value == 0)

# 올바른 예:
is_valid = (
    (input_value > 0 and input_value < 10) or
    (input_value == 0)
)

# 잘못된 예:
max_value = (value1 if value1 > value2 else value2) if value1 > value3 else value3

# 올바른 예:
max_value = (
    (value1 if value1 > value2 else value2)
    if value1 > value3
    else value3
)
  • 여러 줄에 걸쳐 식을 쓰 떄는 줄이 계속된다는 표시를 하는 \ 보다는 괄호를 사용하라.
# 잘못된 예:
result = value1 + \
         value2 - \
         value3 * \
         value4

# 올바른 예:
result = (value1 +
          value2 -
          value3 *
          value4)

임포트

PEP 8은 모듈 임포트해 코드에 사용하는 방법에 대해서도 가이드 라인을 제공한다.

  • imort 문(from x impoty y도 포함) 항상 파일 맨 앞에 위치시켜라
  • 모듈을 임포트할 때는 절대적인 이름(absolute name)을 사용하고, 현 모듈의 경로에 상대적인 이름은 사용하지 말라. 예를 들어 bar 패키지로부터 foo모듈을 임포트 한다면 from bar import foo라고 해야 하며 단지 import foo라고 하면 안된다.
  • 반드시 상대적인 경로로 임포트해야 하는 경우에는 from . import foo 처럼 명시적인 구문을 사용한다.
  • 임포트를 적을 때는 표준 라이브러리 모듈, 서드 파티 모듈, 개발자가 만든 모듈 순서로 섹션을 나눠라 섹션에서는 알파뱃 순서로 모듈을 임포트 하라

정리

  • 파이썬 코드를 작성할 때는 항상 PEP8 스타일 가이드를 따른다.
  • 큰 파이썬 커뮤니티와 공통된 스타일을 공유하면 다른 사람과 협력할 때 도움이 된다.
  • 일관성 있는 스타일을 사용하면 나중에 자신이 작성한ㄴ 코드를 직접 수정할 때도 더 수월해진다.
profile
Jr. DataEngineer

0개의 댓글