Python PEP 8 코드 스타일 가이드

PythonBeginner
지금 연습하기

소개

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

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 96%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

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 개발자에게 있어 협업을 촉진하고 코드 품질을 향상시키는 핵심적인 실천 사항입니다.