Python Clean Code
개요
파이선 클린 코드에 대한 이야기. 위키독스1, 위키독스2에 공개된 문서를 많이 참조하여 정리하였다. 다른 문서도 참고하였다. 빠진 링크가 있을 수 있다.
기본 문법
기본 문법 [https://wikidocs.net/83755] 이 많이 정리되어 있다. 살짝 정리해보면,
magic method
매직 메소드 혹은 특별 메소드(special method)라고 불린다.
- getattribute() : . 접근자에 대한 멤버 속성 호출
- init() : 생성자 매직 매소드. 클래스 명 뒤에 ()를 붙이면 호출
- call() : 인스턴스 호출 매직 메소드. 인스턴스명 뒤에 ()를 붙이면 호출
- contains() : in에 대한 바인드. Boolean으로 반환함.
class Boundaries:def __init__(self, width, height):self._width = widthself._height = heightdef __contains__(self, coord):x, y = coordreturn (0 <= x < width) and (0 <= y < height)class Grid:def __init__(self, width, height):self.width = widthself.height = heightself.limit = Boundaries(width, height)def __contains__(self, coord):return coord in self.limitdef mark_coordinate(grid, coord):if coord in grid:grid[coord] = MARKED
docstring
언어별로 있는 문서화를 위한 주석
class MyClass"""docstring은 이렇게 달린다.javadoc은 클래스 위로 가지만, python은 클래스명 아래에 docstrings를 의미하는 쌍따옴표 세개로 구성한다.python에는 멀티라인 주석이 공식적으로 없으므로 docstrings로 대체하기도하는데 나중에 문서화하면 이상해질 듯."""
annotation
어노테이션. 타입 힌트를 줄 떄 사용한다(용도가 더 있을 수 있음!) 자바의 어노테이션과는 다르다. 파이선에서 타입을 명시해줄 때 사용한다.
def get_name (user: User) -> UserName:...return username
pythonic
파이썬스러운 코드. 파이선을 파이썬이라고 쓰는 것도 열받는다.
list slice
리스트를 슬라이스해서 뽑을 수 있는 ?오퍼레이터?? 언어적허용?함수?? 이다. 내부적으로는 __getitem__라는 매직 메서드로 동작한다.
raw_list = [1,2,3,4,5,6,7,8,9,10]# list_name[시작인덱스 : 끝인덱스(+1) : 단계]# 시작인덱스와 종료 인덱스표시two_to_four = raw_list[2:4] # (3,4)to_four = raw_list[:4] # (1,2,3,4)by_two_step = raw_list[::2] # (1,3,5,7,9)# 역방향 슬라이스도 가능하다from_last_minus_two = raw_list[-2:] # (9, 10)to_list_minus_three = raw_list[:-3] # (1,2,3,4,5,6,7)minus_four_to_minus_one = raw_list[-4:-1] # (7,8,9)# 역방향 스텝으로 원본 리스트를 반대로 뒤집기reverse_list = raw_list[::-1]
멤버 함수 네이밍
Class 내부의 멤버 함수에 대한 Access Modifier(Visibility Modifier)가 없기 때문에, private인 경우 함수명 앞에 underbar를 두개 붙여 쓴다. 이 경우 name magling이 돌아서 클래스와 함수명이 붙은 형태의 새로운 네이밍이 부여된다. _classname__functionname 형식으로 작성되며, 원본 펑션명으로는 접근이 힘들지만 해당 형식으로 접근도 가능하다.
class NewClassdef __init__(self):self.timeout1 = 1self._timeout2 = 2self.__timeout3 = 3new_class = NewClass()print(new_class._timeout2) # 2print(new_class.__timeout3) # AttributeError: 'new_class' object has no attribute '__timeout3'print(new_class._NewClass__timeout3) # 3
변경 가능한(mutable)파라미터 기본 값(⭐️)
이런 일은 하면 안된다. [https://wikidocs.net/168359]