필자가 처음으로 접했던 프로그래밍 언어는 C언어다. 윤성우의 열혈강의를 읽으면서 재밌게 코딩의 세계에 입문하게 되었던 기억이 난다. 그리고 석사 과정을 밟으면서는 matlab을 많이 사용했다. 해당 연구 분야의 시뮬레이션 코드들이 대부분 matlab으로 작성되어 있었기 때문이다. 그러나 머신러닝/딥러닝을 연구에 접목하면서부터는 matlab의 한계를 느끼기 시작했다. 대부분의 라이브러리가 유료였기 때문이다. 그래서 넘어오게 된 언어가 바로 파이썬이다. 파이썬에서는 머신러닝/딥러닝에 관한 많은 훌륭한 라이브러리가 무료다. 그리고 직장에 와서도 여전히 파이썬을 이용해서 웹 사이트와 응용 프로그램 등을 개발하고 있다. 파이썬이 필자에게 돈을 벌어다 주는 언어가 되었다.
현재 필자는 프로그래밍 언어 중 파이썬 비교적 가장 많이 친하긴 했지만, 파이썬스럽게(pythonic 이란 표현을 쓰더군요) 코딩하고 있는 지는 아직 의문이 들 때가 많다. 내가 짠 코드는 파이썬 코딩을 하는 사람들이 쉽게 이해할 수 있는 코드인가? 누군가와 협업하기에 좋은 코드인가?
필자와 같은 고민을 하고 있는 개발자 또는 개발자 지망생을 위한 문서가 있다.
무려 파이썬 언어의 창시자 귀도 반 로섬이 작성한 PEP 8 - Style Guide for Python Code를 읽어보자. 파이썬 코딩을 위한 관습을 정리해놓은 문서다. 참고로 귀도 반 로섬은 1956년 생이고 네덜란드 출신의 프로그래머다. 환갑이 넘었지만 여전히 활발히 활동하고 있다.
자, 그러면 PEP 8의 내용을 함께 정리해보자. 필자 눈에 띄었던 부분을 위주로 정리했으니 좀 더 자세한 내용은 원본 문서를 참고하기 바란다.
파이썬 코드를 위한 스타일 가이드 - PEP 8
1. 가장 중요한 것은 일관성이다. 일관성 있는 스타일로 코딩해야 한다는 것이다. 여기서는 이런 식으로, 저기서는 저런 식으로 하면 코드의 독자들의 가독성을 현저히 떨어뜨릴 수 있다.
2. 들여쓰기 레벨마다 4개의 스페이스를 사용해라(4칸을 띄워라). 탭보다는 스페이스를 사용하는 것이 좋다.
여러 줄 구성에서 닫는 중괄호/대괄호/괄호는 다음과 같이 목록의 마지막 줄에서 공백이 아닌 첫번째 문자 아래에 정렬될 수 있다.
또는 여러 줄 구성을 시작하는 줄의 첫번째 문자 아래에 정렬될 수 있다.
3. 한 줄은 최대 79개의 문자로 제한하라.
4. 이항 연산자 전에 줄을 바꿔라.
5. 탑 레벨의 함수와 클래스 정의는 두 줄의 빈 행으로 둘러싸주고, 클래스 내 메서드 정의는 한 줄의 빈 행으로 둘러싸줘라. 함수 내에 논리 섹션을 나타내기 위해서 빈 줄을 사용할 수 있다.
6. 임포트는 분리된 라인으로 이뤄져야 한다. 임포트는 항상 파일의 최상단에서 이뤄지게 하라. 와일드카드 임포트(from <모듈> import *)는 피해라.
7. 임포트는 파일의 최상단에 이루어져야 한다. 임포트할 때는 표준 라이브러리, 서드 파티, 로컬 라이브러리 순서로 임포트한다. 세 그룹을 구분을 짓기 위해 한 줄의 빈 행을 넣어준다.
8. 의미없는 공백(whitespace)을 만들지마라.
하지만 가독성을 위해 공백을 사용해야 할 때도 있다.
다른 것과 정렬시키기 위해 일부러 공백을 만들지마라.
9. 사칙연산 관련해서는 다음과 같이 공백을 활용하여 가독성을 높여라.
10. 여러 구문(statements)을 한 줄에 사용하는 것은 지양하라.
11. 주석은 코드가 바뀔 때마다 최신 상태에 맞게 업데이트해줘라. 모순된 주석은 없는 것보다 못하다. 가급적 영어로 주석을 달아라.
12. 줄 주석(line comments)은 최소한으로, 아껴서 사용하라.
13. 모든 모듈, 함수, 클래스, 메서드에 대해 독스트링(docstring)을 써라.
참고로 독스트링이란 해당 모듈, 함수 등이 어떤 일을 수행하는지 설명하는 문자열이다. 아래 예제 코드에서 쌍따옴표 3개로 감싸진 부분이 독스트링이다.
14. 함수명과 변수명은 소문자로 써라. 가독성을 높여야하는 경우 단어들을 언더바(_)로 연결해줘라(스네이크케이스를 사용하라).
참고로 스네이크케이스는 company_name, do_something과 같이 단어들을 언더바로 연결해주는 네이밍 방식을 말한다.
15. 클래스명은 캐멀케이스로 써라.
참고로 캐멀케이스는 CompanyName, DoSomething과 같이 단어들의 첫글자를 대문자로 해서 이어주는 방식을 말한다.
16. not ... is 연산자 보다는 is not 연산자를 써라.
17. 예외처리시에는 구체적인 예외를 언급하는 것이 좋다.
18. 객체 타입 비교시에는 직접적으로 비교하기보다는 isinstance()를 사용하라.
19. 문자열, 리스트, 튜플 등의 시쿼스에 대해서는 빈 시퀀스는 false라는 사실을 활용하라.
20. 부울린(boolean) 값들을 True 또는 False와 비교하지 마라.
영어 문서다보니 필자가 잘못 이해하고 정리한 부분이 있을 수도 있으니, 그런 부분을 발견하신 분들께서 교정해주신다면 감사하겠다.
참고자료
'Dev > python' 카테고리의 다른 글
[flask+jinja2] 반올림하기, round 필터 (0) | 2022.03.19 |
---|---|
[python+plotly] 그래프 x축, y축 값 범위 설정하기 (0) | 2022.03.18 |
[python+plotly] px.scatter 플롯에 추세선 넣기 (0) | 2022.03.17 |
[pyqt5] 야구 중계에 스트라이크 존이 제공되지 않을 때 시청자를 위한 가이드 앱 (2) | 2022.03.16 |
[pyside6] QLabel에 이미지 넣을 때 종횡비(aspect ratio) 설정 (2) | 2022.02.27 |
[pyside6] 위젯 내 글자 크기를 변경하고 싶을 때 (0) | 2022.02.26 |
[pyside6] QThreadPool을 이용해서 몇 개의 스레드가 활성화되어 있는지 확인하기 (1) | 2022.02.25 |
[flask+jinja2] 서버에서 받은 html 요소가 html 문서에서 제대로 표현되게 하려면? (0) | 2022.02.06 |