개요에서 말했던 것처럼, Python 코드는 '가장 아름다운 하나의 답이 존재한다'라는 철학을 만족시키는 하나의 스타일로 진화해 왔습니다. 이 '가장 아름다운 하나의 답'을 공식적으로 정리해 두는 곳이 있는데, 바로 PEP(Python Enhancement Proposals, 파이썬 개선 제안서)입니다. 코딩 컨벤션은 개발 조직마다 하나씩 존재하긴 하지만, 일반적으로 그 언어의 문화를 공유하는 공동체에서 인정하는 컨벤션은 대부분 통일되어 있으며, 그런 것들이 PEP에서 지속적으로 문서화되고 있습니다.

PEP는 파이썬 개선 제안서라는 이름대로, Python을 개선하기 위한 제안서를 뜻합니다. PEP1, PEP2, PEP3처럼 넘버링 방식으로 이름짓습니다. PEP에 대해 다루고 있는 PEP 1에서는 PEP를 아래의 3가지로 구분합니다.

  • Standard Track : 새로운 기능이나 구현 제안
  • Informational : 디자인 이슈나 일반적인 지침, 커뮤니티에 정보를 제안. 새로운 기능을 제안하지는 않음
  • Process : Python 개발 과정의 개선을 제안

PEP8

PEP8은 Python 코드를 위한 스타일 가이드를 정리해 둔 Process 타입의 제안서입니다. 수많은 PEP 문서들 중 가장 많은 조회수를 기록했고, PEP가 유명해진 이유입니다. 대부분의 Python 개발자들이 사용하는 일관된 스타일PEP8을 기본으로 하고 있습니다. PEP8에서는 아래와 같은 요소들에 대한 스타일 가이드를 다룹니다.

  • Indentation
  • Tab vs Space
  • 한 라인의 최대 글자 수
  • 각 요소(함수, 메소드, 클래스 등) 간의 blank line 갯수
  • import 스타일
  • 문자열을 감싸는 따옴표
  • Block 주석과 Inline 주석
  • 네이밍 컨벤션
  • ...

PEP20

PEP20은 Python 개발을 위한 철학을 다루고 있는 Informational 타입의 제안서입니다. Python 인터프리터에서 import this를 작성하면 나오는 이스터에그형 출력문과 동일한 내용입니다.

  • Beautiful is better than ugly(아름다움이 추함보다 낫다).
  • Explicit is better than implicit(명시가 암시보다 낫다).
  • Simple is better than complex(단순함이 복잡함보다 낫다).
  • Readability counts(가독성을 계산하라).
  • ...

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 입출력  (0) 2018.07.10
[Python] Comprehension  (0) 2018.07.09
[Python] 패키지  (0) 2018.07.07
[Python] 모듈  (0) 2018.07.06
[Python] 사용자 정의 에러  (0) 2018.07.05

패키지는 Python 모듈을 계층적으로 관리할 수 있게 해줍니다. Java의 패키지 개념과 매우 유사합니다. 패키지는 디렉토리와 파이썬 모듈로 이루어집니다. 아래는 Python 패키지로 구조화한 프로젝트의 예입니다.

디렉토리마다 존재하는 __init__.py는 특별한 용도로 사용됩니다. 이는 해당 디렉토리가 패키지임을 알려주는 역할을 하며, 패키지를 대상으로 와일드카드 import를 수행할 때 반환될 모듈을 결정하기도 합니다. 패키지의 여러 모듈들은 일반적인 모듈과 비슷한 방법으로 불러올 수 있습니다.

예를 들어 Sound/ 디렉토리의 load.py 모듈은 import Sound.load 구문으로 불러올 수 있습니다. 이 구문은 Sound/에서 __init__.py 파일을 찾고, 해당 패키지의 모든 구문을 실행한 후 load.py 모듈에 정의된 모든 요소를 Sound.load라는 네임스페이스에서 사용할 수 있게 됩니다. 일반적으로 __init__.py는 빈 파일로 남겨두는 게 일반적이며 좋은 습관입니다.

import-asfrom-import를 통해서 매우 깊은 패키지의 모듈을 불러올 수 있습니다. import very.deep.module as module이나, from very.deep import module이 이에 해당합니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Comprehension  (0) 2018.07.09
[Python] PEP  (0) 2018.07.08
[Python] 모듈  (0) 2018.07.06
[Python] 사용자 정의 에러  (0) 2018.07.05
[Python] 에러 처리  (0) 2018.07.04

모듈은 함수나 변수, 클래스 등을 모아 둔 .py 확장자를 가진 하나의 Python 파일입니다. 지금까진 모든 코드를 하나의 모듈에서 관리했는데, 프로젝트의 크기가 커지면 모든 코드를 하나의 모듈에 몰아두기 어렵습니다. 기능별로 별도의 모듈에 분산시켜야 하지요.

import

아래는 몇가지 계산 함수를 가진 calculator.py 모듈과, 해당 모듈의 요소를 불러와 사용하는 main.py 모듈의 예입니다.

main.py에서 calculator.py 모듈을 불러오기 위해 import calculator라는 표현을 사용했습니다. import는 이미 만들어진 Python 모듈을 사용할 수 있게 해주는 예약어입니다. 이렇게 import하고 나면, calculator.[요소]처럼 calculator라는 네임스페이스에 도트 연산자를 붙여 해당 모듈의 변수, 함수 등의 요소들을 사용할 수 있습니다.

import-as

import 대상의 이름에 별명을 지어줄 수도 있습니다.

대상의 이름이 매우 길거나, 현재 모듈의 요소와 이름이 겹치는 경우 등을 해결할 수 있습니다

from-import

모듈 이름을 가지고 도트 연산하여 calculator.sum처럼 쓰지 않고, sum과 같이 모듈 내 요소처럼 사용하고 싶을 때도 있습니다. from-import를 사용합니다.

와일드카드로 해당 모듈 내의 모든 요소를 import할 수도 있습니다 asterisk(*) 기호를 사용합니다.

name

종종 Python 코드를 보다 보면, 아래와 같은 표현을 볼 수 있습니다.

__name__은 해당 모듈의 이름을 가지고 있으며, python 혹은 python3 커맨드를 통해 직접 실행한 Python 모듈의 경우 이는 __main__이 됩니다. 따라서 해당 모듈을 직접 실행했을 때만 코드가 실행되도록 하기 위해 이와 같은 표현을 사용합니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] PEP  (0) 2018.07.08
[Python] 패키지  (0) 2018.07.07
[Python] 사용자 정의 에러  (0) 2018.07.05
[Python] 에러 처리  (0) 2018.07.04
[Python] 연산자 오버로딩  (0) 2018.07.02

+ Recent posts