Python tech/고급 파이썬 공부

Python 에러 예방하기 (코드 악취 제거하기)

콜레오네 2023. 3. 2. 00:51

프로그래밍을 하다보면, 다양한 에러를 자주 만나게 되는데

처음에는 이게 문제인지도 모르고 짜게되는 경우가 빈번하게 일어난다.

하지만 경험이 쌓일수록, 문제가 자주 발생하던 코드 패턴에 대해서 본인 스스로도 예방하려고 하게 될텐데

초심자를 위해, 그리고 파이썬을 사용하는 사람일지라도 습관을 들이기 위해

이번 장을 살펴보자

해당 포스팅은 [클린코드, 이제는 파이썬이다] 저서의 일부입니다.


코드 악취 (Code Smell)

- 잠재적인 버그를 암시하는 코드 패턴
- 말그대로 코드에서 악취가 풍겨 이건 분명 에러날 가능성이 높겠다는 생각이 드는 그러한 것들

그렇다면 지금부터 코드 악취의 종류에 대해 알아보고, 예방하는 방법이 있는지 살펴보자

중복 코드

  • 말 그대로, 복붙해서 사용한 비슷한 동작을 수행하는 코드들
  • 이를 함수로 만들어 사용하는것이 좋음
# Bad
print("What is your father's name?")
foo.append(input())
print("What is your mother's name?")
foo.append(input())
print("What is your sister's name?")
foo.append(input())

# Good
def add_family_names(name):
    print(f"What is your {name}'s name?")
    foo.append(input())

names = ['father', 'mother', 'sister']
for name in names:
    add_family_names(name)

매직 넘버 Magic Number

  • 이게 무슨 의미를 가진건지 알 수 없는 숫자
  • 상수 변수에 저장해두어 그 뜻을 알 수 있도록 하자
  • 같은 값이더라도 뜻하는 바가 다를 수 있기에, 두 번 선언하더라도 의미를 명시하자
# Bad
avg_of_week = sumOfWeek() / 7

# Good
DAYS_OF_WEEK = 7
avg_of_week = sumOfWeek() / DAYS_OF_WEEK

죽은 코드

1. 주석처리된 코드

  • 테스트 과정에서 일부 코드를 주석처리하고 넘어가는 경우가 많음
  • 흔한 일이지만, 나중에 본인조차 어떤게 올바른 코드인지 알 수 없음
  • 왜 제거되었는지, 어떤 조건에서 다시 필요한지 알 수 없음
  • 따라서, 주석처리된 코드는 기능 구현 이후에 반드시 제거하도록 하자

2. 절대 만날 수 없는 코드

  • return 뒤에 오는 코드 : 당연히 만날 수 없다
  • 항상 false 조건인 코드

스텁 Stub

  • 구현되지 않은 함수에서 이후 작성될 위치를 나타내어주는 place holder 역할
# pass
def maybe_used_method():
    pass

# NotImplementedError
# 실수로 스텁이 걸린 함수 호출 시, 경고 발생
def not_developed_method():
    raise NotImplementedError

숫자 접미사가 붙은 변수

  • 비슷한 역할을 하는 변수들
  • 좌표를 나타내는 경우
    • x1, x2, y1, x2 : Bad
    • start_x, end_x, start_y, end_y : Good
  • 이런 숫자 붙은 변수가 3개 이상일 경우 -> list나 set 사용하도록 하자

중첩된 리스트 컴프리헨션

  • 리스트 컴프리헨션 list comprehension
    • 반복문을 더 간단하게 표현 가능하며, 불필요하게 코드 수를 늘릴 필요가 없어서 주로 활용됨
  • 하지만 복잡한 리스트 컴프리헨션은 디버깅을 어렵게 하고, 보는 사람도 어지럽게 만듬
numList = [[0,1,2],[3,4],[5]]

# Bad
flatList = [num for sublist in numList for num in sublist]

# Good
flatList = []
for sublist in numList:
    for num in sublist:
        flatList.append(num)
반응형