Pythonic하게 코드 작성하기 - 인덴트, 네이밍컨벤션, 타입힌트
💡우아하게, 파이썬스럽게 코드를 작성해보자.
본 포스팅은 코딩테스트를 염두에두고 작성한 파이썬 코드 작성법이며, 파이썬 알고리즘 인터뷰(박상길 지음, 2020)를 읽으며 정리한 내용임을 밝힙니다.
프로그래밍 언어는 도구다.
어떤 알고리즘을 작성할 때 언어는 도구에 불과한게 맞습니다. 다만, 중요하게 생각해야할 점은
아무리 쉬운 도구라도 제대로 사용법을 숙지해야 제대로 사용할 수 있다.
입니다.
같은 칼이라도, 저의 칼질과 횟집 사장님의 칼질은 차원이 다릅니다.
저 또한 파이썬 문법에 대해 굉장히 깊이있는 내용까지 숙지하지 않고 현업에서, 혹은 학교 과제로 어설프게 익힌 언어로 코딩테스트를 시도할 때면 흔히 말하는 삽질
을 굉장히 많이 했습니다.
비유하자면 횟감
에 집중해야 하는데, 어떤 칼을 쓸지만 고민하다가 시간이 다 지나버리는 거라고 할까요..
따라서 파이썬이 쉬운 언어고 생산성이 좋은 언어로 알려졌다 하더라도 왜 쉽고 생산성이 좋은지 그 원리를 알지 못하면 제대로 그 장점을 활용하긴 어려울 것입니다.
코딩테스트에서도 마찬가지 입니다. 어설프게 알고 있다면 많은 시간을 허비하고 제 시간에 문제를 풀지 못하게 될 것입니다.
본 포스팅에선 파이썬을 파이썬스럽게 작성하는(Pythonic
)방법에 대해 자세히 다뤄볼 것입니다.
기본적으로 알고있다 해도 놓치기 쉬운 고급 문법을 하나씩 살펴볼 예정입니다.
칼따위 신경쓰지 않고 횟감
에 집중할 수 있는 사람이 될 수 있도록 해봅시다!
인덴트(Indent)
- 파이썬은
PEP 8
에 기술된 기준을 적용해 공백 4칸을 원칙으로 합니다. - 파라미터 길이 혹은 함수명이 길어질 때, 개행을 통해 깔끔하게 보이도록한다.
저는 파라미터의 길이가 길어질 때 밑과 같은 함수 정의 및 호출을 매우 선호하는데, 제 생각엔 가장 보기 좋은 것 같습니다.
def function_long_long_name(
variable_one: int, variable_two: int,
variable_three: int, variable_four: int
):
return variable_one
function_long_long_name(
variable_one=1, variable_two=2,
variable_three=3, variable_four=4
)
파이참과 같은 IDE에서는 PEP 8 기준에 코딩스타일을 맞춰줄 수 있도록 해줍니다.
네이밍 컨벤션
파이썬에서는 기본적으로 _
를 통해 단어를 구분하는 Snake Case
를 따릅니다. 자바와 같이 대소문자로 구별하는 방식을 Camel Case
라고 하는데, 파이썬에서는 위 방식을 최대한 지양합니다.
# Snake Case
-> snake_case, var_for_sum, ...
# Camel Case
# lowerCamelCase / UpperCamelCase
-> camelCase, NameOfVariable
타입 힌트
인덴트를 설명할 때 나온 코드에서 작성되어 있는데, Python 3.5 이상부터는 동적 타이핑 언어임에도 불구하고 타입을 명시해줄 수 있습니다.
다만 타입을 명시한다고 해서 동적으로 할당을 못하는건 아니다보니 최대한 명시한 타입에 다른 타입을 할당하는 행위를 최대한 지양하는 것이 좋습니다. 오히려 가독성을 해칠 수 있습니다.
# OK
a: str = '1'
# NO!!
b: int = '1'
# 파라미터의 타입 및 함수의 Return 타입 명시
def function(a: int) -> bool:
return True
위와 같이 타입을 명시해서 보기좋게 제출하면, 코딩테스트에서도 면접관들도 좋은 점수를 줄 수 있을겁니다. 근데 코딩테스트 내에서는 명시하지 않는다고 크게 문제되진 않습니다.
다만 실무에서 코드를 작성할때는 좀 다릅니다. 저는 Django 기반으로 서버를 개발했기 때문에 Python을 사용했고, 가독성을 위해 Type Hint는 꼭 해놓는 편입니다.
Primitive Type 말고도 다양한 ORM 기반 Model들을 사용하기 때문에 안해놓으면 유지보수가 굉장히 힘들어집니다. 그러니 파이썬을 사용할 때 타입힌트를 쓰는 습관을 꼭 들여놓으세요!
mypy
$ pip install mypy
위 모듈을 통해 타입 힌트가 잘못 지정된 변수에 대해 Incompatible return value type 오류를 발생시켜 동적 할당으로 인한 문제 야기를 최소화할 수 있습니다.
다음 포스팅에서는
- 리스트 컴프리헨션
- 제너레이터
- range
- enumerate
에 대해 다뤄보겠습니다.