이번 포스팅은 PEP8에 대해 써보려고 합니다.
PEP8은 Python 코드를 깔끔하고 일관되게 유지하기 위한 스타일 가이드입니다. 이 가이드를 따름으로써 코드의 가독성이 향상되고, 다른 개발자가 코드를 이해하고 유지보수하기 쉬워집니다. 협업을 위해서는 이를 지키는 것이 중요하겠죠?
지금부터 PEP8의 핵심 주제들에 대해 더 자세히 설명하고, 각각에 대한 예시를 제공하겠습니다.
함수의 본문, 조건문, 루프, 리스트, 딕셔너리 및 기타 여러 구조의 본문을 구분하기 위해 들여쓰기를 사용하며, 공백 4개를 권장합니다.
(파이썬을 이제 막 시작하시는 분들은, 추후에 함수, 조건문, 루프 등에 대해 설명드리겠습니다. 쉬워요… 겁 먹지 마세요)
# 좋은 예
if x == 4:
x, y = y, x
# 나쁜 예
def my_function():
print("Hello, World!")
# 결과 : IndentationError: expected an indented block
탭과 공백(Tabs and Spaces)에 대한 규칙은 코드의 일관성을 유지하기 위해 매우 중요합니다. 만약 혼용하여 사용했을 시, 문법 오류로 간주하여 에러가 납니다.
Python 3에서는 공백 4개를 사용하는 것이 좋으며 이는 Python 커뮤니티 내에서 널리 받아들여지는 표준입니다.
# 나쁜 예
if x == 4:
∙∙x, y = y, x # 여기서 ∙는 탭을 의미합니다.
# 좋은 예
if x == 4:
∙∙∙∙x, y = y, x # 여기서 ∙는 공백을 의미합니다.
한 줄은 최대 79를 넘지 않는 것이 좋습니다. 이 규칙은 코드를 여러 디스플레이에서도 쉽게 읽을 수 있게 하며, 여러 코드 파일을 병렬로 비교할 때 유용합니다.
# 좋은 예시
def my_function():
really_long_variable_name = 'This is a really long string that goes' \
'beyond the recommended line length of 79 characters'
위의 예시에서 세번째 줄을 두 번 들여쓰기를 하는 이유는, 세 번째 줄이 두 번째 줄의 연속임을 시각적으로 명확히하기 위함입니다.
# 나쁜 예시
def my_function():
really_long_variable_name = 'This is a really long string that goes beyond the recommended line length of 79 characters'
상위 레벨 함수와 클래스 정의 사이에는 두 개의 빈 줄을 둡니다. 클래스 내의 메소드 정의 사이에는 한 개의 빈 줄을 사용합니다.
# 좋은 예
import sys
def function_one():
pass
def function_two():
pass
class MyClass:
def method_one(self):
pass
def method_two(self):
pass
위의 예시는 각각의 함수와 클래스가 잘 구분되어 보입니다.
# 나쁜 예
import sys
def function_one():
pass
def function_two():
pass
class MyClass:
def method_one(self):
pass
def method_two(self):
pass
나쁜 예에서는 blank lines가 무시되어 코드의 구분들이 명확하지 않습니다. 이는 가독성을 저하시키고, 코드의 이해를 어렵게 만듭니다.
임포트는 파일의 시작 부분에 단독으로 존재해야 하며, 표준 라이브러리, 서드파티 라이브러리, 그리고 로컬 애플리케이션/라이브러리 임포트로 구분하여 각각 그룹을 지어 줄 바꿈으로 분리합니다.
# 좋은 예
import os
import sys
from third_party import something
from third_party.foo import bar
from your_app import local_stuff
❓ 표준 라이브러리 : Python 설치 시 기본적으로 포함되어 있는 라이브러리 집합
서드파티 라이브러리 : 별도로 설치해야 하는 외부 라이브러리
로컬 애플리케이션/라이브러리: 특정 애플리케이션 내부에서만 사용되는 모듈이나 패키지를 의미
공백은 다음과 같은 상황에서 사용됩니다:
# 좋은 예
a = b + c
x = y * z
# 좋은 예
my_list = [1, 2, 3, 4]
my_dict = {'a': 1, 'b': 2}
# 좋은 예
my_function(a, b, c)
주석은 완전한 문장으로 작성해야 하며, 코드의 의도를 명확하게 설명해야 합니다. 불필요한 주석은 피하며, 코드의 복잡한 부분을 해석하거나 이유를 설명하는 데 사용합니다. 주석은 최신 상태로 유지되어야 하며, 코드를 수정할 때 주석도 함께 업데이트해야 합니다.
과도한 주석 사용은 오히려 코드 를 읽기 어렵게 만들 수 있으므로, 코드가 명확하고 간결한 경우 주석을 최소화하는 것이 좋습니다.
블록 주석은 #
기호를 사용하여 여러 줄에 걸쳐 설명을 추가할 때 사용합니다. 각 줄은 #
으로 시작해야 하며, 함수, 클래스, 복잡한 코드 블록의 시작 부분에 작성하여 해당 부분의 목적이나 동작 방식을 설명합니다.
인라인 주석은 코드 라인의 끝에 추가하여, 그 라인의 코드가 하는 일을 짧게 설명합니다. 인라인 주석은 코드 라인 끝에서 최소한 두 개의 공백 후에 #
기호를 사용하여 작성합니다.
# 블록 주석 예시
# 이 함수는 사용자의 입력을 받아
# 입력된 값에 10을 더한 후 결과를 출력합니다.
def add_ten(x):
return x + 10 # 인라인 주석 예시: 10을 더함
# 리스트의 각 요소에 add_ten 함수를 적용합니다.
results = [add_ten(i) for i in range(5)] # 0부터 4까지의 숫자에 10을 더함
PEP8에서는 변수, 함수, 클래스 등 권장하는 명명규칙이 있습니다. 명명규칙도 위에서 언급된 7가지 규칙과 마찬가지로 명확성과 간결성이 명하게 표현되어야 합니다.
변수명과 함수명은 소문자로 작성하며, 단어 사이에는 언더스코어(_
)를 사용합니다.
ex) my_variable
, calculate_value()
상수는 모든 글자를 대문자로 작성하며, 단어 사이에 언더스코어(_
)를 사용합니다.
ex) SECRET_KEY
CapWords 컨벤션을 사용합니다. 각 단어의 첫 글자는 대문자로 시작합니다.
ex) MyClassName
언더스코어(_
) 로 시작합니다. 이는 변수가 클래스 내부에서만 사용되어야 함을 의미합니다.
ex) _iternal_info
더블 언더스코어로 시작하고 끝나는 특별한 메소드(예: __init__
, __str__
)는 매직 메소드 또는 던더 메소드라고 불립니다. 이들은 Python의 특별한 동작을 위해 예약된 이름입니다.
i
, j
, k
, x
, y
등)을 사용할 수 있지만, 가능한 한 문맥에서 의미가 명확해야 합니다.self
를 사용하여 클래스의 인스턴스를 참조합니다.cls
를 사용하여 클래스 자체를 참조합니다.
개발자들은 코드를 작성하는 시간보다 코드를 읽는 시간이 더 길다고 합니다. 이는 프로그래밍을 시작하기 전 레퍼런스를 찾을 때, 문제에 직면했을 때, 혹은 함께 협업하는 개발자의 코드를 리뷰하는 시간이 생각보다 많다는 뜻인데요.
내가 다른 사람의 코드를 많이 보는 것처럼 다른 사람도 나의 코드를 볼 수 있다는 점을 유의하며 간결하고 명확한 코드를 작성하는 것이 중요합니다.
저는 PEP8의 핵심만을 작성했는데, 더 자세하게 공부하고싶은 분들은 아래의 링크에 들어가서 PEP8에 대해 더 읽어보시는 것도 좋을 것 같습니다 :)