[파이썬] 파이썬 클린코드 - 소개, 코드 포매팅, 도구

Yohan_05·2023년 4월 28일
0

python

목록 보기
2/4

이 글은 위키독스의 파이썬 틀린코드를 보고 공부한 내용을 정리한 글입니다

프로그래밍 언어란

프로그래밍 언어는 인간의 아이디어를 다른 개발자에게 전달하는 것이라고 볼 수 있다.
왜 ? : 프로그래밍 언어를 컴파일하고 실행시키는 주체는 컴퓨터이나 프로그램은 지속적으로 유지보수하고 발전해 나가는 존재이기 때문.

클린코드?

사전적 의미

  • 잘 작성되어 가독성이 높고, 단순하며, 의존성을 줄이고, 중복을 최소화하여 깔끔하게 잘 정리된 코드.

작성 원칙

  1. 가독성 : 이해하기 쉬운 용어를 사용, 코드 작성 시 들여쓰기 기능을 사용
  2. 단위성 : 한 번에 한 가지 처리만 수행, 클래스/메소드/함수를 최소 단위로 분리
  3. 의존성 : 영향도를 최소화, 코드의 변경이 다른 부분에 영향이 없게 작성
  4. 중복성 : 중복된 코드를 제거, 공통된 코드를 사용
  5. 추상화 : 클래스/메소드/함수에 대해 동일한 수준의 추상화 구현, 상세 내용은 하위 클래스/메소드/함수에서 구현.]

PEP-8같은 지침도 있기에 나중에 따로 공부하며 적용시켜볼 예정이다.

설명을 해보자

설명을 하지 않아도 되는 코드가 제일 좋은 코드지만, 자신이 썼던 코드를 이해할 때나, 다른 사람이 썼던 코드를 이해해야할 때 주석이 있으면 조금 더 편리하다.

1. 주석

"주석은 코드로 아이디어를 제대로 표현하지 못했음을 나타내는 것이다."

주석이 좋지 않은 이유

  1. 주석은 초보자로 하여금 읽기 어렵게 한다. (코드에 포함되어있기 때문)
  2. 개발자는 주석을 업데이트하는 것을 깜빡하는 경우가 많음 -> 버전이 다른 경우가 많음.

주석을 사용해야하는 경우?

  • 외부 라이브러리에 오류가 있을 경우에.

2. 함수의 이름과 파라미터의 이름

# 길이 있으면 집에 가고, 길이 없으면 근처 찜찔방으로 가는 함수

def if_way_is_exist_go_home_or_go_neart_sauna():
	...
	LOGIC
	...

3. Docstring

docstring은 각 함수나 클래스에 추가할 수 있는 설명 문서이다.

선언

docstring은 간편하게 함수,모듈,클래스의 선언부 아래에 멀티라인 주석을 붙임으로써 추가할 수 있다.

  1. 함수
def some_func():
	"""Hello Function Docstring"""
  1. 클래스
class SomeClass():
	"""hello Class Docstring"""
  1. 모듈
# some_module.py
"""Hello Module Docstring"""

호출

__doc__을 통해 호출할 수 있다.

그래서 Docstring이 왜 좋음?

가장 큰 이유는 파이썬이 동적 타이핑을 하기 때문. 파이썬은 파라미터 타입, 반환 타입 체크를 강요하지 않음. 자바와 파이썬을 비교해보자.

String getUserName(User user){
	...
    return userName
}
def get_user_name(user):
	...
    return user_name

위의 자바 코드에서는 유저 객체를 매개변수로 받아 문자열 데이터 타입인 string으로 반환하는 것을 직관적으로 알 수 있음.

하지만 파이썬 코드는 get 이라는 키워드를 보아 유저의 이름을 가져오는 것을 알 수 있지만 그 유저의 이름이 어떤 유저의 이름만을 위해 만들어진 객체인지 단순 문자열인지 알 수 없다.

물론 함수명이나 파라미터명에서 충분히 설명되어 있다면 이를 보완할 수 있다. 그게 아니라도 코드를 보면 쉽게 알 수 있지만 너무 귀찮지 않은가.

그래서 파이썬 대화형 인터프리터를 통해 바로 실행하여 쉽게 알 수 있는 docstring이 답이 될 수 있다.

def get_user_name(user):
	"""
    	Description:
        	유저의 객체를 통해 유저의 이름을 알아내는 함수.
        Param:
        	some_module.user.User 클래스의 객체를 파라미터를 받음.
        Return:
        	some_module.user_name.UserName 객체를 반환.
    """
    
    ...
    
    return user_name
>>> get_user_name??

	-----------------------------------------------------
    # Result
    -----------------------------------------------------
    Description: 
        유저의 객체를 통해 유저의 이름을 알아내는 함수.
    Param:
        some_module.user.User 클래스의 객체를 파라미터로 받음.
    Return:
        some_module.user_name.UserName 객체를 반환.    
    -----------------------------------------------------

그래서 이거 완벽함?

그건 아니다. 사실 설명 없이 코드만 보아도 직관적으로 이해가 되는 코드가 제일 좋다. 클린코드에서 권장하는 Docstring 예시를 보자면

def data_from_response(response: dict) -> dict:
	"""
    response에 문제가 없다면 response의 payload를 반환
    
	- response 사전의 에제::
    {
    	"status":200, # <int>
        "timestamp" : "....", # 현재 시간의 ISO 포맷 문자열
        "payload": {...} #반환하려는 사전 데이터
   }	
   
   - 반환 사전 값의 예제::
   {"data" : {..} }
   
   - 발생 가능한 예외:
   - HTTP status가 200이 아닌 경우 ValueError 발생
   """
   
	if response["status"] != 200:
    	raise ValueError
    return {"data" : response["payload"]}

여러가지 docstring 예시가 있기 때문에 팀원들과 프로젝트를 진행할때 합의하게 잘 결정하면 될 듯 싶다.

4. 어노테이션

자바의 어노테이션과 파이썬의 어노테이션은 많이 다르다.

어노테이션?

파이썬의 어노테이션은 타입에 대한 설명을 위해서 만들어져 있다. 어노테이션은 힌트를 활성화시켜주는 역할을 수행한다.

코드로 바로 알아보자.

def get_user_name(user: User) -> UserName:
    """
        Description: 
            유저의 객체를 통해 유저의 이름을 알아내는 함수 입니다.
        Param:
            some_module.user.User 클래스의 객체를 파라미터로 받습니다.
        Return:
            some_module.user_name.UserName 객체를 반환합니다.     
    """

    ...

    return user_name

자바와 어느정도 비슷해진 파이썬을 볼 수 있다. 어노테이션을 명시한다면 어떤 타입을 파라미터로 받는지, 어떤 타입을 리턴하는지 쉽게 알 수 있다. 개발자가 위의 코드를 본다면 User 인스턴스를 파라미터로 받아서 UserName 인스턴스로 반환한다는 것을 알 수 있을 것이다.

그럼 타입힌트를 명시하고 실행시켰을때 타입과 다를때 에러가 나는가? 그건 아니다. PEP484에선 아래와 같이 말하고 있다.

"파이썬은 여전히 동적인 타입의 언어로 남을 것이다. 타입 힌트를 필수로 하자거나 심지어 관습으로 하자는 것은 전혀 아니다."

profile
안녕하세요 DevOps 엔지니어로 현업에서 활동중인 요한이라고 합니다.

0개의 댓글