[python cleancode] 1. 소개, 코드 포매팅과 도구

햄도·2021년 4월 8일
1

Python Cleancode

목록 보기
1/9

출처

파이썬 클린코드를 읽으며 정리한 내용입니다.

클린 코드의 의미

  • 클린 코드란? 유일한 정의는 없다.
  • 언어로 의사소통을 원활하게 할 수 있도록 하는 것이 클린코드의 본질

클린 코드의 중요성

  • 기획자가 새로운 기능을 요구할 때마다 리팩토링을 하고, 기술부채를 해결하기 위해 멈추는 일 -> 자주 겪는 문제
  • 기술부채는 장기간동안 문제를 일으키며 이자를 유발한다. 기술 부채가 발생했다는 것은 내일은 코드를 수정하기가 더 어렵고 비싸며, 내일모레는 더더욱 비싸질 것이라는 의미
  • 이런 문제를 겪지 않고, 꾸준하게 예측 가능한 속도로 개발하고 싶다면 코드가 유지보수 가능한 상태로 가독성이 높아야 한다.
  • 클린 코드를 통해 민첩한 개발, 지속적인 배포 가능

클린 코드를 위해 코드 포매팅 하기

  • 클린 코드에서 코드 포매팅의 역할
    • 클린 코드가 곧 포매팅은 아니지만, 코드를 올바르게 포매팅하는 것은 작업을 효율화하기 위해 중요하다.

프로젝트 코딩 가이드라인 준수

  • 코드 레이아웃에 일관성이 있어야 가독성이 높아지며, 신속하게 패턴을 파악해 오류를 감지하기 쉬워진다.
  • 특히 파이썬에서는 PEP-8을 기본적으로 따라야 한다. PEP-8은 다음과 같은 특징을 가지고 있다.
    • 검색 효율성: code에서 token을 grep하기 좋게 작성하도록 한다.
    • 일관성: 코드가 코드 레이아웃, 문서화, 이름 작명 규칙 등에서 일정한 포맷을 가질 수 있도록 한다.
    • 코드 품질: 코드를 구조화하여 살펴보면 쉽게 코드를 이해하고 실수를 찾을 수 있다.

Docstring 작성

  • docstring은 소스 코드에 포함된 문서를 말한다.
    • 이것은 단순 주석과는 다르다. 코드로 아이디어를 모두 표현하는 것이 좋고, 실수로 수정을 깜박하는 경우 주석과 실제 로직이 다른 경우가 발생하기 때문에 주석 작성은 최대한 피해야 한다.
  • docstring으로 예상되는 함수의 입력과 출력, 동작방식 등을 문서화하면 다른 개발자가 이해하기 쉽다.
help(dict.update)
Help on method_descriptor:

update(...)
    D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
    If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
    If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
    In either case, this is followed by: for k in F:  D[k] = F[k]
  • docstring은 코드의 일부로, 객체에 docstring이 정의되어 있으면 __doc__속성을 통해 접근이 가능하다.
def my_function():
    """임의의 계산 수행"""
    return None
my_function.__doc__
'임의의 계산 수행'
  • 단 docstring은 계속해서 수작업으로 업데이트해줘야 한다는 단점이 있다. 소프트웨어는 단순한 코드가 아니기 때문에, 문서는 산출물에 함께 포함되어 있어야 한다.

어노테이션(타이핑) 작성

  • 코드 사용자에게 함수 인자로 어떤 값이 와야 하는지 힌트를 주는 것
  • 힌트이기 때문에 해당 타입을 강제하진 않는다.
  • 어노테이션을 이용해 타입뿐만 아니라 변수를 이해하는 데에 도움이 되는 어떤 형태의 메타데이터라도 지정할 수 있다.
class Point:
    def __init__(self, lat, long):
        self.lat = lat
        self.long = long
    
def locate(latitude: float, longitude: float) -> Point:
    # 함수의 인자와 반환 값의 예상 타입 지정
    pass
# __annotations__로 지정한 속성 확인 가능
locate.__annotations__
{'latitude': float, 'longitude': float, 'return': __main__.Point}
  • 위와 같은 annotation 속성을 이용해 문서 생성, 유효성 검증, 타입 체크 등을 할 수 있다.
  • 어노테이션으로 타입 이외에도 변수의 의도를 설명하는 문자열, 콜백이나 유효성 검사 함수로 사용할 수 있는 callable 등을 사용할 수 있다.
# from collections.abc import Callable -> 3.9부터 지원
from typing import Callable

def feeder(get_next_item: Callable[[], str]) -> None:
    # Body
    pass

def async_query(on_success: Callable[[int], None],
                on_error: Callable[[int, Exception], None]) -> None:
    # Body
    pass
feeder.__annotations__
{'get_next_item': typing.Callable[[], str], 'return': None}
class Test:
    a: "test 변수" = 0
Test.__annotations__
{'a': 'test 변수'}
  • 어노테이션이 함수의 파라미터 또는 속성의 타입을 문서화해주긴 하지만 그렇다고 해서 docstring이 필요없어진 것은 아니다.
  • 특히 동적 데이터 타입과 중첩 데이터 타입의 경우 예상 데이터의 예제를 제공해 어떤 형태의 데이터를 다루는지 제공하는 것이 좋다.
  • docstring은 단위 테스트에서도 유용한 정보로 사용된다.

코드 포매팅 자동 검사를 위한 도구

  • 코드 포매팅은 기본 중 기본이기 때문에 직접 살펴보는 것은 시간낭비이며 자동으로 검사하도록 해야 한다.
  • 이러한 검사에 실패하면 빌드도 실패하도록 해야 한다.

코드 검사: Pylint

  • 코드의 구조를 검사하는 다양한 도구가 있지만, 저자피셜 Pylint가 가장 완결성이 높다고 한다.
  • 검사할 코드 경로를 넣고 실행하면 점수를 계산해준다. ㅠㅠ
!pylint /workspace/my_code.py
(내용 생략)

-----------------------------------
Your code has been rated at 5.74/10

타입 힌팅: Mypy

  • 파이썬에서 가장 일반적으로 사용하는 정적 타입 검사 도구. 가끔 잘못 탐지하는 경우도 있다.

자동 검사 설정

  • makefile을 빌드 외에도 포매팅 검사나 코딩 컨벤션 자동화에 사용할 수 있다.
  • Black과 같은 도구로 자동으로 코드를 포매팅하는 것도 좋은 방법 중 하나이다
profile
developer hamdoe

0개의 댓글