Python PEP 8 코드 스타일 가이드

PythonBeginner
지금 연습하기

소개

본 실습에서는 Python 코드에 PEP 8 스타일 가이드 (style guide) 를 적용하는 방법을 배웁니다. PEP 8 은 Python 의 공식 스타일 가이드로, 읽기 쉽고 일관성 있는 코드를 작성하기 위한 권장 사항 세트를 제공합니다. 이러한 지침을 따르면 자신과 다른 사람들이 코드를 더 쉽게 읽을 수 있습니다.

들여쓰기 (indentation), 줄 길이 (line length), 공백 (spacing), 명명 규칙 (naming conventions) 에 대한 주요 PEP 8 규칙을 구현하는 연습을 하게 됩니다. 또한, autopep8 도구를 사용하여 코드를 자동으로 포맷팅하는 방법을 학습하여 시간을 절약하고 커뮤니티 표준 준수를 보장하는 방법을 배우게 됩니다.

PEP 8 들여쓰기 및 줄 길이 이해하기

적절한 들여쓰기 (Indentation) 와 줄 길이 (Line Length) 는 가독성 높은 Python 코드의 기본입니다. 이 단계에서는 이 두 가지 측면에 대한 PEP 8 가이드라인을 학습하고 적용해 볼 것입니다.

들여쓰기: PEP 8 은 들여쓰기 수준당 4 개의 공백을 사용할 것을 권장합니다. 이는 Python 커뮤니티에서 강력하게 지켜지는 관례입니다.

줄 길이: PEP 8 은 모든 줄을 최대 79 자로 제한할 것을 제안합니다. 독스트링 (docstrings) 과 주석의 경우, 제한은 72 자입니다. 이는 특히 작은 화면이나 코드를 나란히 비교할 때 가독성을 향상시킵니다.

이제 이를 실습해 보겠습니다. 왼쪽 파일 탐색기에서 indentation_example.py 파일을 찾아 엽니다. 내부 코드는 함수 정의 및 여러 줄로 된 구문에 대한 올바른 들여쓰기를 보여줍니다.

## 4 개의 공백을 사용한 올바른 들여쓰기.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

## 시연을 위한 변수 정의.
var_one = "first"
var_two = "second"
var_three = "third"
var_four = "fourth"

## 여는 구분자 (delimiter) 에 맞추어 정렬.
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

## 행잉 들여쓰기 (hanging indent) 사용. 첫 번째 줄에는 인수가 없으며,
## 후속 줄들은 구분을 위해 들여쓰기 됩니다.
bar = long_function_name(
    var_one, var_two,
    var_three, var_four)

## 여러 줄로 된 리스트.
my_list = [
    1, 2, 3,
    4, 5, 6,
]

## 출력을 생성하기 위해 함수 호출.
long_function_name("first call", "second", "third", "fourth")
foo = long_function_name("second call", "second", "third", "fourth")
bar = long_function_name("third call", "second", "third", "fourth")

코드를 검토한 후, 스크립트를 실행하여 출력을 확인합니다. WebIDE 하단의 터미널을 열고 다음 명령을 실행합니다:

python ~/project/indentation_example.py

스크립트가 실행되어 각 함수 호출의 첫 번째 인수를 출력할 것입니다. 출력 결과는 다음과 같습니다:

first call
second call
third call

이 연습은 일관된 들여쓰기가 복잡한 함수 호출과 데이터 구조를 훨씬 더 읽기 쉽게 만드는 방법을 보여줍니다.

간격 및 명명 규칙 연습하기

일관된 간격과 명확한 명명 규칙 또한 코드 가독성에 매우 중요합니다. 이 단계에서는 이 두 가지에 대한 PEP 8 규칙을 다룹니다.

간격:

  • 대부분의 연산자 (=, +=, ==, <, >) 주위에 공백 하나를 사용합니다.
  • 리스트, 튜플 및 함수 인수의 쉼표 뒤에 공백을 사용합니다.
  • 괄호, 대괄호 또는 중괄호 바로 안쪽의 추가 공백은 피합니다.

명명 규칙:

  • snake_case: 함수와 변수에 사용합니다 (예: my_function, user_name).
  • PascalCase: 클래스 이름에 사용합니다 (예: MyClass).
  • UPPERCASE_SNAKE_CASE: 상수에 사용합니다 (예: MAX_CONNECTIONS).

이 규칙들이 실제로 어떻게 적용되는지 살펴보겠습니다. 파일 탐색기에서 style_guide_example.py 파일을 엽니다. 이 코드에는 올바른 간격 및 명명의 예시가 포함되어 있으며, 비교를 위해 잘못된 버전은 주석 처리되어 있습니다.

## 상수
MAX_OVERFLOW = 100

## PascalCase 로 된 클래스 이름
class MySampleClass:
    def __init__(self, name):
        ## snake_case 로 된 변수 이름
        self.instance_name = name

    ## snake_case 로 된 함수 이름
    def sample_method(self, var_one, var_two):
        ## 연산자 주변 및 쉼표 뒤의 올바른 간격
        result = var_one + var_two
        print(self.instance_name, result)

## --- 비교를 위한 잘못된 예시 ---
## class mySampleClass:
##     def SampleMethod(self, varOne, varTwo):
##         result=varOne+varTwo
##         print(self.instance_name,result)

## 객체 생성 및 메서드 호출
my_object = MySampleClass("TestObject")
my_object.sample_method(10, 5)

변경 사항이 있다면 파일을 저장하고 터미널에서 실행합니다.

python ~/project/style_guide_example.py

출력 결과는 객체의 이름과 계산 결과를 보여줍니다.

TestObject 15

이러한 간격 및 명명 규칙을 따르면 코드의 구조와 목적이 모든 독자에게 즉시 더 명확해집니다.

자동 포맷팅을 위해 autopep8 사용하기

Manually formatting code can be tedious. Fortunately, tools exist to automate this process. In this step, you will install and use autopep8, a popular tool that automatically reformats Python code to conform to the PEP 8 style guide.

First, you need to install the autopep8 package. Open the terminal and run the following command. sudo is used to install it system-wide.

sudo pip3 install autopep8

The installation process will begin, and you should see output confirming its successful installation:

Collecting autopep8
...
Successfully installed autopep8-X.Y.Z

Next, let's work with a Python file that has deliberately poor formatting. In the file explorer, open unformatted_code.py and examine its content:

a=1
b=2;
def  my_function ( arg1 , arg2 = 0 ):
    result = arg1+arg2
    print( result)

This code has several style issues: inconsistent spacing, a redundant semicolon, and extra spaces in the function definition.

Now, let's use autopep8 to fix it. The --in-place flag tells the tool to modify the file directly. Run this command in your terminal:

autopep8 --in-place ~/project/unformatted_code.py

After the command finishes, open unformatted_code.py again in the editor. You will see that the code has been automatically cleaned up:

a = 1
b = 2


def my_function(arg1, arg2=0):
    result = arg1 + arg2
    print(result)

Notice how autopep8 corrected the spacing, removed the semicolon, and added two blank lines before the function definition, as recommended by PEP 8. Using an auto-formatter like autopep8 is a highly efficient way to maintain a consistent code style across your projects.

종합 적용: 스크립트 리팩토링

이제 배운 모든 것을 적용할 시간입니다. 이 단계에서는 여러 PEP 8 지침을 위반하는 스크립트를 수동으로 리팩토링합니다. 이 연습은 들여쓰기, 간격 및 명명 규칙에 대한 이해도를 테스트합니다.

먼저, 파일 탐색기에서 refactor_challenge.py를 엽니다. 이 파일에는 직사각형의 넓이를 계산하지만 스타일이 좋지 않게 작성된 다음 코드가 포함되어 있습니다.

## This script calculates the area of a rectangle and prints it.
def CalculateArea(width,height):
    Area = width*height ## calculate area
    return Area

w = 10
h = 5
rectangle_area=CalculateArea(w,h)
print("The area of the rectangle is:",rectangle_area)

여러분의 임무는 이 코드를 편집기에서 수동으로 수정하여 PEP 8 을 준수하도록 만드는 것입니다. 다음 사항에서 문제를 찾아보세요.

  1. 함수 명명: 함수 이름은 snake_case여야 합니다.
  2. 변수 명명: 변수 이름도 snake_case여야 합니다.
  3. 간격: 연산자 주변 및 쉼표 뒤의 적절한 간격을 확인합니다.
  4. 주석: 인라인 주석 뒤에는 # 다음에 공백이 있어야 합니다.

잠시 시간을 내어 코드를 직접 리팩토링해 보세요. 완료되면 코드가 다음과 유사하게 보일 것입니다.

## This script calculates the area of a rectangle and prints it.
def calculate_area(width, height):
    """Calculate and return the area of a rectangle."""
    area = width * height  ## calculate area
    return area


w = 10
h = 5
rectangle_area = calculate_area(w, h)
print("The area of the rectangle is:", rectangle_area)

변경 사항을 확인하세요. CalculateAreacalculate_area로, Areaarea로 변경되었으며 간격이 수정되었습니다. 또한 함수가 무엇을 하는지 설명하기 위한 모범 사례로 함수에 독스트링 (docstring) 을 추가했습니다.

변경 사항을 저장하고 스크립트를 실행하여 여전히 올바르게 작동하는지 확인합니다.

python ~/project/refactor_challenge.py

출력 결과는 다음과 같아야 합니다.

The area of the rectangle is: 50

이 연습은 스타일을 위한 리팩토링이 코드의 동작을 변경하지는 않지만, 가독성과 유지보수성을 극적으로 향상시킨다는 것을 보여줍니다.

요약

본 실습 (lab) 에서는 Python 의 PEP 8 스타일 가이드의 기본 사항을 배웠습니다. 들여쓰기, 줄 길이, 간격 및 명명 규칙에 대한 규칙을 적용하는 연습을 했습니다. 또한 코드를 자동으로 포맷하여 이러한 표준을 충족시키는 autopep8의 강력함도 발견했습니다. 마지막 리팩토링 과제를 완료함으로써 이 모든 개념을 통합하여 스타일이 좋지 않은 스크립트를 깔끔하고 읽기 쉬우며 유지보수 가능한 Python 코드로 변환했습니다. PEP 8 을 준수하는 것은 모든 전문 Python 개발자에게 있어 협업을 촉진하고 코드 품질을 향상시키는 핵심적인 실천 사항입니다.