[python][TIL] python 컨벤션

12985 단어 pythonTILTIL

정리하고 가실게여

 내 나름대로 최대한 가독성이 좋은 코드를 짜려고 신경쓰고 있었지만, 하다보니 변수명이 복잡해지는 상황도 많이 나오고 여러 스타일의 코드를 보다 보니까 갈 수록 일관성이 없어지는 느낌이 들었다. 이참에 다른 사람들과 확실히 코드로 의사소통하기 쉬어지도록 컨벤션에 대해 알아보고 가려고 한다. 오늘은 파이썬.

PEP8

 파이썬의 창시자 귀도 반 로섬이 제시한 코딩 스타일이다. Pythonic(파이썬스럽게)하게 코드를 작성하기 위한 가이드라고 보면 된다. 파이썬 코딩에 가장 표준이 되는 가이드이기 때문에 PEP8 중에서 코딩에 자주 사용되는 내용을 정리해보려고 한다.

근데, 들어가기 전에 PEP는 서두부터 예외를 언급한다.

규칙을 어기는 2가지 좋은 예외 사항
1. 규칙을 적용한 코드가 규칙을 숙지한 사람의 눈에도 읽기 어려운 경우
2. 일관성을 지키려고 한 수정이 다른 규칙을 어기는 경우

이렇게 말한 것을 보면 PEP가 그렇게 강력한 규칙 적용을 정의하진 않는 것 같다. 규칙을 따르되, 처한 상황에서 규칙이 방해된다면 어겨도 된다. 라는 좀 개방적인 마인드의 가이드 인것 같다(맘에 드는군😎).

1. 들여쓰기

 들여쓰기는 tab을 사용하기보다는 4개의 스페이스를(!!!😲) 권장한다. 호불호가 갈리는 문제라서 딱 이거다 라고 말하진 않지만 4개의 공백을 사용하는 것을 "권장"한다고 한다.

 한 줄의 코드를 여러줄로 나눠 쓰는 경우 다음 사항으로 고려해야한다.

  1. 첫번째 줄에 인자가 있으면 수직정렬하여 읽기 좋게 만든다.
  2. 첫번째 줄에 인자가 없다면, 추가로 들여쓰기를 하여 다음 행과 구별되도록 해야한다.

ex)

# 첫번째 줄에 인자가 있으면 수직정렬을 하여 인자들을 보기 좋게 한다.

좋은 예)
foo = long_function_name(var_one, var_two,
			 var_three, var_four)
             
foo = log_fucntion_name(
        var_one, var_two
        var_three, var_four)

나쁜 예)
# 수직정렬을 하지 않는다면, 첫번째 라인에 인자가 오면 안 된다.
foo = long_function_name(var_one, var_two,
		var_three, var_four)
        

# 첫번째 줄에 인자가 없다면, 한번 더 들여쓰기(4개의 공백)하여 다음행과 구분이 되도록 한다.
좋은 예)
def long_function(
        var_one, var_two,
        var_three, var_four):
    print(var_one)

나쁜 예)
def long_function(
    var_one, var_two,
    var_three, var_four):
    print(var_one)

2. 한 줄에 적는 글자 수는 79자 이내로

 상황에 맞게 더 늘릴 수는 있지만 그래도 99자를 넘기지 않을 것을 권장한다.

3. 개행

 함수와 클래스의 정의는 2줄씩 띄어 쓴다. 클래스 내 메소드 정의는 1줄씩 띄어 쓴다.

class Foo:
    def func1(self):
    	print("func1")
        
    def func2(self):
    	print("func2")


def ex_function1():
    print("ex_function1")
    
    
def ex_function2():
    print("ex_function2")

4. 공백

  • 대괄호 및 소괄호 안, 쉼표(,), 콜론(:), 세미콜론(;) 앞에 불필요한 공백은 피한다.
  • 할당(=), 증감연산자(+=, -=), 비교연산자(==, <, >, !=, <>, <=, >=, in, not in, is, is not), Boolean연산자(and, or, not)를 사용할 때 한 칸씩 띄워준다.
  • 우선순위가 낮은 연산자들 위주로 한 칸씩 띄워준다.
  • 키워드 인자와 인자의 기본값의 '='는 붙여 쓴다.

ex)

좋은 예)
grade(math[1], {english: 80})

i = i + 1
sum += 1
x = x*2 + 1
result = x*x + y*y
c = (a+b) * (a-b)

def complex(real, imag=0.0):
    return magic(r=real, i=imag)
    
나쁜 예)
grade( math[ 1 ], { english : 80 } )

i=i+1
sum+=1
x = x * 2 + 1
result = x * x + y + y
c = (a + b) * (a - c)

def complex(real, imag = 0.0):
    return magic(r = real, i = imag)

5. 연산자가 들어간 여러 줄의 계산식은 연산자를 제일 앞에 두어라

 문장의 제일 뒤에 있으면 알아보기 힘들고, 수정하기 불편하다

sentence = func("Hello"
            +"My"
            +"Name is")

6. 소스코드의 인코딩은 UTF-8로

7. import

  • 와일드카드 import(import *)은 피하라🤦‍♂️
    와일드 카드로 임포트를 하게 되면 어떤 이름이 현재 스코프에 존재하는지 명확하지 않게 된다. 개인적으로 코드의 직관성도 떨어지고 코드의 효율성도 떨어지게 된다고 생각한다.
나쁜 예)
from math import *
  • 한 줄에 두개의 모듈을 import 하는 것은 바람직하지 않다.
나쁜 예)
import os, sys

좋은 예)
import os
import sys
  • import 순서
    아래의 순서대로 import한다.
standard libray
third party
local application or library

8. 괄호를 닫는 위치

 마지막 줄에 맞추거나, 첫번째 줄에 맞쳐서 닫는다.

my_list = [
    1, 2, 3, 
    4, 5, 6,
    ]
    
    or
    
mylist = [
    1, 2, 3,
    4, 5, 6,
]

9. Naming Convenction

  • 밑줄(_)
    변수명 앞에 밑줄 : 내부적으로 사용되는 변수 ex) _singleval
  • 소문자 l, 대문자 O,대문자 I는 변수명세 사용하지 않는다.
  • 모듈명은 짧은 소문자로 구성되어 필요하다면 밑줄로 나눈다.
  • 클래스명은 카멜케이스로 작성한다. 내부적으로 사용되면 앞에 _를 붙인다. 예외는 실제로 에러인 경우엔 "Error"를 뒤에 붙인다.
  • 함수명은 소문자로 구성하되 필요하면 밑줄로 나눈다.

이를 정리하자면 이렇게 정리할 수 있을 것 같다.

ClassName
ExceptionName

module_name
package_name
method_name
function_name
function_parameter_name
global_var_name
local_var_name
instance_var_name

GLOBAL_CONSTANT_NAME

좋은 웹페이지 즐겨찾기