본문 바로가기
language/Python

[Python] 보편적인 python coding convention(파이썬 코딩 컨벤션)

by 스파이디웹 2022. 4. 27.
728x90

파이써닉하다

읽기도 편하고 가독성이 높은 코드

파이써닉하기 위해 코딩 규칙을 정해 놓은것을 코딩 컨벤션이라고 함.

  • 한 줄의 한 구문을 준수
if x == 1: print('O')
  • kwargs는 정말 필요한 경우에만 쓰자 가독성을 저해시킬 수 있음
  • 클래스에서 private속성을 가진 변수는 이름 앞에 _(언더스코어)를 사용하여 표현
  • 사용하지 않을 변수는 __(언더스코어 2개)로 표현하자. 1개만 사용하는 것은 지양
for __ in range(100):
    print('테스트')
  • 동일한 내용물을 가진 리스트를 생성할때는 *를 활용
list_repeatitive = ['hi'] * 4
print(list_repeatitive)
  • 다차원 리스트를 생성할 경우 리스트 내포를 적극 활용
lists = [["hi"] for __ in range(5)]
print(lists)
  • 값이 True, 거나 None이거나 0인 경우 따로 값을 비교시킬 필요가 없음
  • if문에서 dict.has_key()를 쓰지 말고 in으로 키의 존재 여부를 파악
  • lambda + filter, lambda + map을 활용할 수 있으면 적극 활용
  • 파일을 읽는 경우 with open을 사용

개행

  • 길고 이어지는 경우에는 ()를 사용하도록 하기, 닫는 괄호는 개행하기 전에 닫기
from some.deep.module.inside.a.module import (
    a_nice_function, another_nice_function, yet_another_nice_function)

my_very_big_string = (
    "For a long time I used to go to bed early. Sometimes, "
    "when I had put out my candle, my eyes would close so quickly "
    "that I had not even time to say “I’m going to sleep.”")
  • 개행할때 사칙연산 기호가 있다면 개행 후 기호를 표시
(one
+ two)

import

  • import 할때는 연속적으로 하지 않고 별도로 하는게 합리적
import os
import re
  • from을 사용하여 import 할때는 연속적으로 해도 좋음
from pyspark.sql.types import StructType, StringType

들여쓰기

인덴트(Indent): 공백으로 4칸 들여쓰기

  • 인덴트가 권장사항인 다른 언어들에 비해 파이썬에게 인덴트는 지켜야만 하는 대표적인 특징
  • tab 과 공백을 섞어 쓰지않고, 공백 4개를 사용하는 것을 권장

공백

Blank Lines: 함수 및 클래스 정의 위에는 빈 2줄

  • 두개의 빈 줄로 함수 및 클래스 정의를 구분한다. 또한 클래스 내의 메소드 정의에는 1줄씩 빈 줄을 넣어 씀
  • 불필요한 공백은 지양하라. ,, :, ;가 나온 후에만 공백을 두는게 트랜드,  한개의 원소를 가진 튜플인 경우 마지막에 ,찍고 띄어쓰기 금지 연산 기호의 경우 앞 뒤로 공백을 줌
spam(ham[1], {eggs: 2})
bread = (3,)
total_age = person1.age + person2.age

괄호, 중괄호, 대괄호 내부에 연결되는 부분

좋음: spam(ham[1], {eggs: 2})
나쁨: spam( ham[ 1 ], { eggs: 2 } )

콤마, 세미콜론, 콜론의 이전 위치

좋음: if x == 4: print x, y; x, y = y, x
나쁨: if x == 4 : print x , y ; x , y = y , x

함수 호출시 인수 목록이 시작되는 괄호의 바로 이전 위치

좋음: spam(1)
나쁨: spam (1)

인덱싱 혹은 슬라이싱이 시작되는 괄호의 바로 이전 위치

좋음: dict['key'] = list[index]
나쁨: dict ['key'] = list [index]

할당(혹은 기타 다른) 연산자 주변에 한 개를 초과하는 공백 문자가 있는 경우

좋음
x = 1
y = 2
long_variable = 3
나쁨
x             = 1
y             = 2
long_variable = 3

항상 이진 연산자의 주위에는 한 개의 공백을 넣는다: 할당 (=), 증감 할당 (+=, -= 등.), 비교 (==, <, >, !=, <>, <=, >=, in, not in, is, is not), 부울 연산 (and, or, not)

좋음
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
나쁨
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)

키워드 인수 혹은 기본 매개변수 값을 나타내는 경우에는 = 기호 주위에 공백을 넣지 않음

좋음
def complex(real, imag=0.0):
    return magic(r=real, i=imag)
나쁨
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)

복합 구문(Compound statements, 여러 구문이 한 줄에 있는 것)은 일반 적으로 권장되지 않음

좋음
if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()

한 행의 최대 길이

  • 한 행에는 최대 79글자까지만 넣도록 함

주석문

  • 인라인 주석문은 코드와 동일한 행에 기술되는 주석문
  • 인라인 주석 문은 코드에서 최소한 두 개 이상의 공백으로 분리되어 있어야 함
  • 주석문은 # 문자와 한 개의 공백으로 시작해야 함

아래와 같은 뻔한 내용의 인라인 주석문은 불필요

x = x + 1                 # x의 증가

아래와 같이 특정한 의미를 할 때 의미가 있는 주석문.

x = x + 1                 # 경계값에 대한 보상

명명규칙

  • b (한 개의 소문자)
  • B (한 개의 대문자)
  • lowercase
  • lower_case_with_underscores
  • UPPERCASE
  • UPPER_CASE_WITH_UNDERSCORES
  • CapitalizedWords (CapWords 혹은 CamelCase – CamelCase라는 이 름은 글자가 툭 튀어나온 모양 때문에 붙은 이름이다 [3]_). 간혹 StudlyCaps이라고도 불린다.
  • mixedCase (CapWords와 다른 점은 첫 글자가 소문자라는 것이다)
  • Capitalized_Words_With_Underscores (이건 별로다!)
  • ‘l’ (소문자 L), ‘O’ (대문자 O), ‘I’ (대문자 I) 한 글자를 변수 이름으로 사용하지 않음

 

함수, 변수, Attribute는 소문자로 단어 간은 밑줄(_)을 사용하여 연결

def func_name():
	pass

tot_no = []

클래스는 단어 첫 문자마다 대문자를 써서 연결하는 CapWords 포맷으로 명명

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

모듈명은 짧게 소문자로 사용하며 밑줄을 쓸 수 있다. 패키지명 역시 짧게 소문자를 사용하지만 밑줄은 사용하지 않음

모듈 상수는 모두 대문자를 사용하고 단어마다 밑줄로 연결하는 ALL_CAPS 포맷으로 명명

MAX_COUNT = 100

클래스의 public attribute는 밑줄로 시작하지 말아야 함

class Student:
    schoolName = 'XYZ School' # class attribute

    def __init__(self, name, age):
        self.name=name # instance attribute
        self.age=age # instance attribute

클래스의 protected instance attribute는 하나의 밑줄로 시작

class Modifiers:

    def __init__(self,name):
        self._protected_member = name # Protected Attribute

클래스의 private instance attribute는 2개의 밑줄로 시작

class Modifiers:

    def __init__(self, name):
        self.__private_member = name  # Private Attribute

인스턴스 메서드는 (객체 자신을 가리키기 위해) self 를 사용

class DecoratorExample:
  """ Example Class """
  def __init__(self):
    """ Example Setup """
    print('Hello, World!')
    self.name = 'Decorator_Example'
  def example_function(self):
    """ This method is an instance method! """
    print('I\'m an instance method!')
    print('My name is ' + self.name)

클래스 메서드는 (클래스 자신을 가리키기 위해) cls 를 사용

class DecoratorExample:
  """ Example Class """
  def __init__(self):
    """ Example Setup """
    print('Hello, World!') 
  @classmethod
  def example_function(cls):
    """ This method is a class method! """
    print('I\'m a class method!')
    cls.some_other_function()
  @staticmethod
    def some_other_function():
    print('Hello!')

 

참조:

https://blex.me/@baealex/pythonic%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://luavis.me/python/python-convention

728x90

댓글