파이썬 코딩컨벤션

반디·2023년 3월 23일
0

코테스터디

목록 보기
1/11

[컨벤션 참고문헌]

네이밍

  • 변수, 함수, 클래스의 이름은 의미있는 단어로 간결하게 설정
  • 변수명, 함수는 snake_case, 클래스는 CamelCase
  • 동일한 대상에 대해서는 같은 단어 사용하기
##BAD##
def get_user_info(): pass
def get_client_data(): pass
def get_customer_record(): pass

##GOOD##
def get_user_info(): pass
def get_user_data(): pass
def get_user_record(): pass

함수

  • 중복된 기능은 함수로 구현
  • 함수는 하나의 기능을 구현하도록 작성
  • 함수 구현 시, default argument 설정하기
def create_micro_brewery(name: str = "Hipster Brew Co."):
slug = hashlib.sha1(name.encode()).hexdigest()
# etc.
  • 함수의 인자는 (되도록) 2개 이하로
##BAD##
def create_menu(title, body, button_text, cancellable):
pass

##GOOD##
from typing import NamedTuple
class MenuConfig(NamedTuple):
"""A configuration for the Menu.
Attributes:
title: The title of the Menu.
body: The body of the Menu.
button_text: The text for the button label.
cancellable: Can it be cancelled?
"""
title: str
body: str
button_text: str
cancellable: bool = False
def create_menu(config: MenuConfig):
title, body, button_text, cancellable = config
# ...
create_menu(
MenuConfig(
title="My delicious menu",
body="A description of the various items on the menu",
button_text="Order now!"
)
)
  • 함수의 인자로 flag(boolean 변수)는 사용하지 않기
  • 함수에서 global 인자를 변경하거나, file에 쓰는 작업은 피하기
    (함수 외부의 object, 변수 등에 접근 최소화)

클래스

  • Single Responsibility Principle (SRP): 하나의 클래스는 "하나"의 구체적인 일을 담당
    • 하나의 클래스가 하나의 메서드를 가져야하는 것은 아니지만 하나의 클래스에 독립적인 작업을 수행하는 여러 개의 메서드가 정의되는 것은 지양해야함
  • Open/Close Principle (OCP): 시스템 확장을 위해 새로운 기능을 추가할 수 있도록 열려있어야 함. 그렇지만 새로운 기능을 추가할 때, 기존 코드는 변경되지 않아야함
  • Interface Segregation Principle (ISP): 가능한 작은 단위로 인터페이스를 분리하여 각 클래스의 역할을 명확히 해야함
  • Liskov Substitution Principle (LSP): A가 B의 하위 클래스라면 B의 속성을 변경하지 않고도 A로 치환할 수 있어야함
#LSP를 위반하는 사례 
from dataclasses import dataclass


@dataclass
class Response:
     """An HTTP response"""

     status: int
     content_type: str
     body: str


class View:
     """A simple view that returns plain text responses"""

     content_type = "text/plain"

     def render_body(self) -> str:
          """Render the message body of the response"""
          return "Welcome to my web site"

     def get(self, request) -> Response:
          """Handle a GET request and return a message in the response"""
          return Response(
               status=200,
               content_type=self.content_type,
               body=self.render_body()
          )


class TemplateView(View):
     """A view that returns HTML responses based on a template file."""

     content_type = "text/html"

     def get(self, request, template_file: str) -> Response:  # type: ignore
          """Render the message body as HTML"""
          with open(template_file) as fd:
               return Response(
                    status=200,
                    content_type=self.content_type,
                    body=fd.read()
               )


def render(view: View, request) -> Response:
     """Render a View"""
     return view.get(request)

TemplateView의 get 메서드는 View의 get 메서드와 다른 인자 구성을 가지므로 incompatible, LSP를 위반하는 사례임

profile
꾸준히!

0개의 댓글