[Pyhton] Python Convention (코딩규칙)

참조


Python 코딩 규칙

  • 파이썬의 좋은점 중 하나는 가독성입니다.
  • 파이썬은 다른 언어로 작성된 코드 보다 훨씬 더 잘 읽힙니다.
  • Pythonic하게 코드를 작성하면 이와 같은 장점을 극대화 시킬 수 있습니다.
  • Pythonic이란 '파이썬다운' 이라는 의미로 파이썬 특유의 문법을 잘 활용하여 효율적이고 간결하게 코드를 작성하는 것을 가리킵니다.
  • Pythonic한 방식을 통해 가독성을 높이고 유지보수도 쉽게 할 수 있습니다.

들여 쓰기

  • 들여쓰기는 4개의 space 사용합니다.
  • 괄호 안에 연속된 줄은 내어쓰기를 통해 세로로 정렬 해야 합니다.
  • 괄호 안에 내어쓰기를 사용할 때 첫 번째 줄에는 인자가 없어야 합니다.
  • 연속된 줄로 표현 하기 때문에 들여 쓰기를 사용해야 합니다.
  • 기본적으로 space를 통해 들여쓰기를 사용합니다.
  • 이미 탭으로 들여쓰기가 사용된 코드만 일관성을 위해 탭으로 들여쓰기를 합니다.
  • 탭과 space가 혼용된 경우 space만 사용하도록 변환해야 합니다.

좋은 예

def long_function_name (
    var_one, var_two, var_three,
    var_four) :

나쁜 예

def long_function_name (var_one,
var_two, var_three,
var_four) :

한행의 최대 길이

  • 모든 행은 최대 79자로 제한 합니다.
  • Python 표준 라이브러리 행은 79자로 제한되어 있습니다.
  • 여러 줄을 표현하는 가장 좋은 방법은 괄호를 통해 감싸는 방법 입니다.
  • with 문과 같이 괄호를 통해 여러줄을 표현하지 못하는 경우 \ 를 사용합니다.
with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

빈 줄

  • 최 상위 수준 함수와 클래싀 정의는 두 줄을 띄워서 구분합니다.
  • 클래스의 메서드 정의는 한줄을 띄워서 구분합니다.
import module


class A(object):
       pass


class B(object):
       pass


def main():
       a = module.A()
       return 0

...

인코딩

  • 모든 식별자ASCII 문자로만 작성 가능합니다.
  • 식별자는 영어만 사용하도록 합니다.
  • 문자열 리터럴과 주석 반드시 ASCII 문자만 사용하도록 합니다.
  • 테스트 목적으로 ASCII 문자 이외의 문자를 사용할 수 있습니다.
  • 코드 저자 이름을 작성할 시 ASCII 문자 이외의 문자를 사용할 수 있습니다.

import

  • import는 항상 코드 맨위에, 모듈 전역 상수 앞, 모듈 주석과 독 스트링뒤에 놓입니다.
  • import 순서
    • 표준 라이브러리
    • 제 3 관련 부분
    • Local application/library
  • 일반적으로 import는 별도에 행에 있어야 합니다.

좋은 예

import os
import sys

from subprocess import Popen, PIPE
# 하나의 패키지에서 여러개의 모듈을 가져오는 경우 위와 같은 방식은 괜찮습니다.

나쁜 예

import sys,os

괄호

  • 괄호, 중괄호 또는 대괄호 내부에서 불필요한 공백을 사용하지 않습니다.
  • 괄호내 여러줄 구조를 갖는 경우 마지막 줄이 아닌 다음 줄에 닫는 괄호를 사용합니다.
  • 후행 쉼표와 닫는 괄호 사이 불필요한 공백을 사용하지 않습니다.
  • 함수호출에서 인수를 넣는 여는 괄호, 인덱싱 여는 괄호에서 불필요한 공백을 사용하지 않습니다.

좋은 예

my_list = [
    1, 2, 3,
    4, 5, 6,
]
spam(ham[1], {eggs: 2})
foo = (0,)
spam(1)
dct['key'] = list[index]

나쁜 예

my_list = [1, 2, 3,4, 5, 6,]
spam( ham [ 1 ], { eggs : 2} )
foo = (0, )
spam (1)
dct ['key'] = list [index]

명명 규칙

  • 암시적인 것보다 명시적인 명명법이 좋습니다.
  • 쉬운 코드를 작성하기 위해 가독성이 좋은 문자와 단어를 선택해야 합니다.
  • 올바른 코드 스타일을 사용하는 만큼 이름 또한 신중하게 선택해야 합니다.
  • Python에서 이름을 지정하는 가장 좋은 방법은 설명적인 이름을 사용하여 이름을 지정하는것 입니다.
  • 단어를 약어로 사용하지 않으며 문자를 삭제하지 않아야 합니다.
  • [-"Internal"-]은 모듈 내부 또는 클래스 내부에서 보호 및 비공개를 의미 합니다.
Type Public Internal Examples
Packages lower_with_under pacakge, mypackage
Modules lower_with_under _lower_with_under module.py, my_module.py
Classes CapWords _CapWords Model, MyClass
Exceptions CapWords MyExceptionError
Functions lower_with_under() _lower_with_under() function, my_function
Local Variables lower_with_under x, var, my_variable
Global/Class Variables lower_with_under _lower_with_under x, var, my_variable
Global/Class Constants CAPS_WITH_UNDER _CAPS_WITH_UNDER CONSTANT, MY_CONSTANT
Instance Variables lower_with_under _lower_with_under (protected) x, var, my_instance
Method Names lower_with_under() _lower_with_under() (protected) method, class_method
Function/Method Parameters lower_with_under parameter, parameter_two

Package & Module

  • 패키지명은 소문자 단어를 사용합니다.
  • 패키지에는 밑줄을 사용하지 않습니다.
  • 모듈명은 소문자 단어를 사용하며 짧게 지정합니다.
  • 모듈명에 여러 단어를 사용하는 경우 _를 사용합니다.
from mypackage import my_module.py

Class

  • 클래스 이름은 Camel case 방식을 사용합니다.
  • Camel case 방식이란 단어 첫 문자 마다 대문자를 써서 연결하는 방식 입니다.
    class MyClass:
    ...

Exception

  • 예외는 클래스 명명 규칙과 동일 합니다.
  • 예외가 실제 오류인 경우 예외 이름뒤에 Error를 추가합니다.
except CumstomError as e:
    ..

Constant

  • 상수는 일반적으로 모듈 수준에서 정의됩니다.
  • 상수명은 모두 대문자로 작성합니다.
  • 여러 단어를 사용할 경우 _로 단어를 구분 합니다.
  • 상수명을 _로 시작하여 외부 접근으로부터 보호할 수 있습니다.
MY_CONSTANT = 100
_PROTECTED_MY_CONSTANT = 100 # 모듈 내부에서만 사용하는 상수

Variables

  • 소문자 단일 문자나 소문자 단어를 사용합니다.
  • 여러 단어를 사용할 경우 _로 단어를 구분 합니다.
  • global 변수명을 _로 시작하여 외부 접근으로부터 보호할 수 있습니다.
my_variable = 100
global global_my_variable = 100 # 일반적인 global 변수 사용
global _global_my_variable = 100 # 모듈 내부에서만 사용하는 global 변수

Function & Method

  • 함수명은 소문자 단어를 사용합니다.
  • 여러 단어를 사용할 경우 _로 단어를 구분 합니다.
  • 이미 Camel case 방식과 언더 스코어 방식이 혼용된 모듈에 한해서 같이 사용가능합니다.
    • private 메소드나 private 함수명을 _로 시작하여 외부 접근으로부터 보호할 수 있습니다.
  • 상속된 클래스의 메소드나 인스턴스 변수는 __로 시작합니다.
def my_function():
    ...

def _protected_my_function():
    # 모듈 내부에서만 사용하는 함수
    ...

Function & Method Parameter

  • 함수 이름 규칙과 동일 합니다.
  • 여러 단어를 사용할 경우 _로 단어를 구분 합니다.
  • 메소드 첫번째 인자는 항상 self입니다.
class Singer:
    def sing(self, singer_name):
        return "singer : "+singer_name

Instance Variables

  • 소문자 단일 문자나 소문자 단어를 사용합니다.
  • 여러 단어를 사용할 경우 _로 단어를 구분 합니다.
  • 인스턴스 변수명을 _로 시작하여 외부 접근으로부터 보호할 수 있습니다.
MyClass = my_instance()
MyClass = _protected_my_instance()

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY