이 글은 위키독스의 파이썬 틀린코드를 보고 공부한 내용을 정리한 글입니다
프로그래밍 언어는 인간의 아이디어를 다른 개발자에게 전달하는 것이라고 볼 수 있다.
왜 ? : 프로그래밍 언어를 컴파일하고 실행시키는 주체는 컴퓨터이나 프로그램은 지속적으로 유지보수하고 발전해 나가는 존재이기 때문.
PEP-8같은 지침도 있기에 나중에 따로 공부하며 적용시켜볼 예정이다.
설명을 하지 않아도 되는 코드가 제일 좋은 코드지만, 자신이 썼던 코드를 이해할 때나, 다른 사람이 썼던 코드를 이해해야할 때 주석이 있으면 조금 더 편리하다.
"주석은 코드로 아이디어를 제대로 표현하지 못했음을 나타내는 것이다."
# 길이 있으면 집에 가고, 길이 없으면 근처 찜찔방으로 가는 함수
def if_way_is_exist_go_home_or_go_neart_sauna():
...
LOGIC
...
docstring
은 각 함수나 클래스에 추가할 수 있는 설명 문서이다.
docstring
은 간편하게 함수,모듈,클래스의 선언부 아래에 멀티라인 주석을 붙임으로써 추가할 수 있다.
def some_func():
"""Hello Function Docstring"""
class SomeClass():
"""hello Class Docstring"""
# some_module.py
"""Hello Module Docstring"""
__doc__
을 통해 호출할 수 있다.
가장 큰 이유는 파이썬이 동적 타이핑을 하기 때문. 파이썬은 파라미터 타입, 반환 타입 체크를 강요하지 않음. 자바와 파이썬을 비교해보자.
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 예시가 있기 때문에 팀원들과 프로젝트를 진행할때 합의하게 잘 결정하면 될 듯 싶다.
자바의 어노테이션과 파이썬의 어노테이션은 많이 다르다.
파이썬의 어노테이션은 타입에 대한 설명을 위해서 만들어져 있다. 어노테이션은 힌트를 활성화시켜주는 역할을 수행한다.
코드로 바로 알아보자.
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에선 아래와 같이 말하고 있다.
"파이썬은 여전히 동적인 타입의 언어로 남을 것이다. 타입 힌트를 필수로 하자거나 심지어 관습으로 하자는 것은 전혀 아니다."