프로그래밍/Python

[파이썬 클린코드] 2장 (파이써닉 코드) 정리

Dibrary 2022. 9. 19. 09:50
반응형

안녕하세요 Dibrary입니다. 아래 내용은 파이썬 클린코드의 2장 중 핵심 내용만을 정리한 것입니다.

디자인 패턴은 언어와 무관한 고차원 개념으로, 코드로 즉시 변환되지 않는다.
그러나 관용구는 실제 코딩으로 변환된다.

관용구를 따르는 코드를 파이썬에서 '파이써닉'하다고 한다.

 

1. 리스트에서 특정 요소를 가져올 때, for문으로 찾지 말고 슬라이싱을 하자.

둘 다 같이 2로 나눴을 때 나머지가 1 나오는 값만 담는 것인데, slice를 사용해서 해당 위치의 값만 곧바로 담을 수 있다.

 


2. 파일을 열고 닫는 등의 작업이 필요한 경우 '컨텍스트 관리자'를 사용하자.

위 코드는 finally를 이용해서 정상종료 혹은 비정상종료에도 파일을 닫는 코드가 들어있다.

with를 사용한 컨텍스트 관리자는 내부에서 자동으로 파일을 닫아주므로 close( )를 별도로 써 줄 필요가 없다.

 

컨텍스트 관리자는 내부에서 __enter__와 __exit__ 메서드를 구현해 놓고 사용합니다.

예를 들어, DB를 백업해야 할 때, 기존 시스템을 잠시 멈추고, 백업이 진행된 후에 다시 시스템을 가동한다는 가상코드입니다.

with구문으로 컨텍스트 매니저가 실행되면, 해당 객체의 __enter__로 먼저 들어가서 실행되고, with구문에 속한 '본문 코드'가 실행 됩니다. 본문 코드의 작업이 다 끝난 후에 __exit__메서드가 자동으로 실행되면서 with구문이 끝이 납니다.

 

컨텍스트 매니저는 관심사를 분리하고 독립적으로 유지되어야 하는 코드를 분리하는 좋은 방법이다.

 

contextlib 모듈을 써서 데코레이터로 만들면 굳이 class를 구현하지 않더라도 함수만으로도 구현이 가능하다.

 


3. 프로퍼티

파이썬 객체의 모든 프로퍼티와 함수는 public이다.

파이썬에서 밑줄로 시작하는 속성은 해당 객체에 대해 private을 의미하며, 외부에서 호출하지 않기를 '기대'하는 것이다. (호출할 수가 있으므로 암묵적 합의인 셈이다)

_email이라는 속성에 getter, setter 프로퍼티를 만들어 놓은 것이다.

단순히 속성에 직접 접근해 버려도 속성값은 꺼내어 진다. 하지만, 속성값에 _이 들어가 있으면, 암묵적으로 직접 접근하지 말아야 하기 때문에 getter를 이용해서 접근하자.

_email 속성의 값을 확인할 수 있는 게터 역할의 email메서드를 사용하면 _email 속성을 직접 확인한 것과, 같은 결과를 냄을 볼 수 있다.

 

 


4. 이터러블, 이터레이터

이터러블은 __iter__메서드를 구현한 객체, 이터레이터는 __next__메서드를 구현한 객체다.

객체를 반복하려고 하면 파이썬은 해당 객체의 iter함수를 호출한다. 만일 있으면 해당 함수를 실행한다.

먼저 for문으로 DateIterable객체가 실행되려고 하니 __iter__로 먼저 들어간 후에  __next__메서드가 반복적으로 실행된 것을 확인할 수 있다.

__iter__메서드는 self를 반환하므로 자기 자신이 iterable한 iterator라는 것을 나타내는 셈이다.

__next__메서드는 각 단계마다 자신을 다시 호출한다. 이 메서드에서는 요소를 어떻게 생산하고 하나씩 반환할 것인지를 결정해야 한다.

__iter__메서드는 호출할 때 마다 새로운 iterator를 만들 수 있다.

 

 

iter함수는 객체 내부에 __iter__이 정의되어 있지 않으면, __getitem__을 찾고 그것 도 없으면 TypeError를 발생시킨다.

시퀀스는 __len__과 __getitem__을 구현하고 첫 번째 인덱스 0 부터 시작해 포함된 요소를 한 번에 하나씩 차례로 가져올 수 있어야 한다.

 

728x90
반응형