본문 바로가기
Python

PEP 20 - 높은 수준의 Python 코드를 작성하는 방법

2023. 1. 23.

PEP는 Python Enhance Proposal의 약자로 파이썬 향상 제안으로 직역할 수 있다.
파이썬 코드 작성법에 대한 가이드라인으로 생각하면 될 것 같다.
파이썬 개발자들의 관습이 된 PEP를 따른다면 가독성이 뛰어나고 협업 체계에 유리한 코드를 작성 할 수 있다.

파이썬 유저라면 특히 코딩 방법 결정에 도움을 주며 높은 수준의 코드를 작성하도록 하는PEP 20은 최소 한 번 이상 읽어 보는 것을 강력히 추천한다.

따라서 본 글에서는 PEP 20 각각의 격언과 그 의미에 대해 정리한다.
나의 해석, 느낀점과 코드 예시가 포함된 격언도 있다.

PEP 20 : The Zen of Python

The Zen of Python은 파이썬의 선으로 번역된다.
파이썬 핵심 개발자 중 한 명인 Tim Peters가 쓴 파이썬 설계 원칙으로,
파이썬이 추구하는 철학 정도가 적절한 것 같다.

파이썬 인터프리터에 이스터에그로 포함되어 있으며
확인 방법은 아래 구문을 실행하면 출력된다.

import this


PEP 20 하나씩 살펴보기

Beautiful is better than ugly (아름다운 것이 못생긴 것보다 낫다)
- 작성된 코드를 읽을 때 예쁘다고 느끼게 작성하자

# ugly
num1=1; num2= 2;num3 =3; num4 = num1+num2+num3

# beautiful
num1 = 1
num2 = 2
num3 = 3
num4 = num1 + num2 + num3


Explicit is better than implicit (명시적인 것이 암시적인 것보다 낫다)
- 표현을 명확히하지 않으면 쉽게 이해하지 못할 수 있다

# implicit
def f(a, b):
  return a + b
  
# explicit
def plus_func(num1, num2):
  answer = num1 + num2
  return answer


Simple is better than complex (간단한 것이 복합적인 것보다 낫다)
- 간단하게 작성해야 테스트와 수정이 쉽다

# complex
def get_digit(string):
    digit_list = []
    for char in string:
        if char.isdigit():
            digit_list.append(char)
    return digit_list
    
# simple
def get_digit(string):
    digit_list = [char for char in string if char.isdigit()]
    return digit_list


Complex is better than complicated (복합적인 것이 복잡한 것보다 낫다)
- 복잡한 코드는 가독성이 떨어지고 수정이 어렵다

# complicated
def alphabet_or_digit(string):
    for char in string:
        if char not in 'abcdefghijklmnopqrstuvwxyz' and char not in '0123456789':
            return False
    return True
    
# complex
def alphabet_or_digit(string):
    return string.isalnum()


Flat is better than nested (수평적인 것이 중첩된 것보다 낫다)
- loop 중첩이 늘어날수록 코드를 알아보기 어렵다

# nested
if a > b:
    if c > a:
        print(1)
else:
    print(2)
    
# flat
if b < a < c:
    print(1)
else:
    print(2)


Sparse is better than dense (풀어놓는 것이 밀집된 것보다 낫다)
- 짧게 쓰는 것을 목적으로 한 줄에 많은 동작을 하게끔 무리한 코딩은 좋지 않다

# Dense
print(','.join(map(str, [x * 2 for x in range(10)])))

# Sparse
xdouble = [x * 2 for x in range(10)]
strx = map(str, xdouble)
answer = ','.join(strx)
print(answer)


Readability counts (가독성은 중요하다)
- 매우 중요한 규칙!! 코드는 한 번 작성하지만 여러 번 읽는다
- PEP 8을 따르면 좋다

Special cases aren't special enough to break the rules (특별한 경우도 규칙을 어겨야 할 정도로 특별하지는 않다)
- 규칙은 지키도록 노력하고, 지키자. 규칙을 지키지 않는다는 것은 좋은 관행을 포기하는 것이다

Although practicality beats purity (하지만 실용성은 순수성보다 우선이다)
- 이것은 위의 것과 상충된다. 규칙을 지키지 않지만 더 좋은 선택지가 있다면, 그 좋은 것을 선택하자

Errors should never pass silently (오류는 절대 조용히 넘어가선 안 된다)
- 특히 예외처리를 하는 try - except 구문에서, 에러를 꼭 짚고 넘어가자

# pass
def div_func(num1, num2):
  try:
    return num1 / num2
  except:
    print('Cant divide on 0')  # or just "pass"
    
# don't pass
def div_func(num1, num2):
  try:
    return num1 / num2
  except ZeroDivisionError as e:
    raise e


Unless Explicitly silenced (명시적으로 침묵하지 않는 한)
- 오류가 발생해도 프로그램이 중단되지 않도록 원하는 경우에는 명시적으로 예외를 작성하자
- 실용성은 순수성보다 우선임을 기억하자

In the face of ambiguity, refuse the temptation to guess (애매모호함에 직면한다면, 추측하려는 유혹을 물리쳐라)
- 어떻게 작동하는지 정확히 모르는 코드를 보게 될 경우 추측하지 말고 정확히 이해하자

There should be one-- and preferably only one --obvious way to do it. (그것을 할 수 있는 분명한 하나의 -- 유일하면 더 좋고 -- 방법이 존재할 것이다)
- 해결책은 반드시 존재한다. 멈추지 않고 나아가자.

Although that way may not be obvious at first unless you're Dutch (비록 당신이 네덜란드인이 아니라면 처음에는 그 방법이 분명하지 않을 수도 있다)
- 명백한 해결법이 바로 떠오르지 않을 수 있지만 더 많이 생각하고 노력하자
- 네덜란드인을 왜 언급했나 찾아보니 파이썬 창시자 귀도 반 로섬이 네덜란드인이라 그렇다고 한다..

Now is better than never (지금 하는 것이 아예 하지 않는 것보다 낫다)
- 본인을 스스로 늦추지 말자. 시작하고 차근차근 발전해보자.

Although never is often better than *right* now (아예 하지 않는 것이 지금 *바로*보다 더 나은 경우도 종종 있지만)
- 계획은 구현만큼 중요하다. 너무 급하지는 말자.

If the implementation is hard to explain, it's a bad idea (구현 결과를 설명하기 어렵다면, 그 생각은 별로다)
- 이해가 부족하거나 최적화되지 않은 구현일 것이다.

If the implementation is easy to explain, it may be a good idea (구현 결과를 설명하기 쉽다면, 그 생각은 좋을지도 모른다)
- 심플한 조각들로 구성된 최적화된 구현이며 이해를 잘 하고 있다는 뜻이다.

Namespaces are one honking great idea -- let's do more of those! (네임스페이스는 완전 좋은 생각이다 -- 더 활용하라!)
- 네임스페이스는 파이썬의 핵심 포인트이다.

PEP 20이라는 이름과는 달리 19개만 기록되었다고 한다.

PEP 20 원문 : https://peps.python.org/pep-0020/

 

PEP 20 – The Zen of Python | peps.python.org

PEP 20 – The Zen of Python Author: Tim Peters Status: Active Type: Informational Created: 19-Aug-2004 Post-History: 22-Aug-2004 Table of Contents Long time Pythoneer Tim Peters succinctly channels the BDFL’s guiding principles for Python’s design int

peps.python.org


균일하고 잘 짜여진 Pythonic 코드를 작성하기 위한 스타일 가이드
PEP 8 : Style Guide for Python Code 또한 읽어보길 강력히 추천한다.

반응형

댓글