들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다. 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item44 요약 새로운 클래스 인터페이스를 정의할 때, 간단히 public attribute도 시작하고 Setter / Getter를 가급적이면 사용하지 마라. 객체에 있는 Attribute에 접근할 때, 부가 기능이 필요한 경우 @property로 이를 구현할 수 있음. @property를 사용할 때, 최소 놀람의 법칙을 따르고 이상한 부작용을 만들지 마라. @property 메서드가 빠르게 실행되도록 유지. 느리거나 복잡한 작업의 경우, 일반적인 메서드를 사용하라. @property로 setter를 정의하면..
들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다. 1. Itertools 라이브러리 Itertools 라이브러리에는 이터레이터를 위한 몇 가지 기능들이 추가되어있다. 이터레이터와 관련된 코드가 복잡해지는 경우라면, itertools 라이브러리에서 원하는 기능을 지원하는지 살펴보는 것이 좋을 수 있다. 2. 여러 이터레이터 연결하기 itertools에는 여러 이터레이터를 하나로 합치는데 사용할 수 있는 함수들이 지원된다. 2.1 chain() it = itertools.chain([1,2,3], [4,5,6]) print(list(it)) >>> [1, 2, 3, 4, 5, 6] 여러 이터레이터를 하나의 이터레이터를 합침. 2.2 repeat() # 3번만 반복하는 Iterator 생성 i..
요약 리스트 컴프리헨션은 람다식을 사용하지 않기 때문에 람다식을 사용하는 map, filter 대비 가독성이 좋음. 리스트 컴프리헨션을 이용하면 조건식을 이용해 간단히 특정 원소를 스킵할 수 있음. 그러나 map을 사용할 때는 filter 함수의 도움을 받아야 함. 결론은 map, filter를 사용하면 람다 함수를 사용해야 한다. 그런데 람다 함수는 이름을 가지지 않으므로 람다 함수가 무슨 일을 하는지 이해하기 어렵다. 따라서 가독성이 떨어지는 코드가 된다. Item 27. map과 filter 대신 컴프리헨션을 사용하라 # 짝수를 제곱한 값 구하기 a = [1, 2, 3, 4, 5, 6, 7, 8] # 컴프리헨션 이용 even_squares = [x ** 2 for x in a if x % 2 == ..
요약 데코레이터를 사용했을 때, 데코레이터 함수는 원본 함수의 정보와 Docs에 대한 정보를 더 이상 반환하지 않는다. 데코레이터를 이렇게 사용하면 디버깅 하는 과정에서 잘못 동작할 수 있다. 이런 부분을 해결하기 위해 functools의 wraps 데코레이터를 사용해주면 된다. Item 26. functools.wrap을 사용해 함수 데코레이터를 정의하라 # 데코레이터를 사용하면, 기존 함수의 이름과 __Docs__는 없어짐. # 디버깅 시에 문제가 발생할 수 있음. def deco(func): def wrapper_func(*args, **kwargs): print('here') return func(*args, **kwargs) return wrapper_func @deco def hello(): ..
요약 위치 기반 인자를 의도치 않게 키워드 인자로 사용하는 경우, 함수 호출부와 강하게 결합함. 이 때, 위치 기반 인자의 이름 변화가 이 함수를 호출하는 쪽에도 의도치 않게 영향을 줄 수 있음. 위치 기반 인자, 키워드 기반 인자를 강제할 수 있음. 함수 호출부의 / 앞에 있는 인자들은 위치 기반 인자로만 사용됨. 함수 호출부의 * 뒤에 있는 인자들은 키워드 인자로만 사용됨. 함수 호출부의 /와 * 사이에 있는 인자들은 위치 + 키워드 인자로 둘다 사용될 수 있음. 함수 호출부에서 키워드 기반 인자를 사용하면, 인자의 뜻을 이해하기 쉬워 가독성이 좋아짐. 함수 내에서 옵션으로 사용하는 변수는 키워드 기반 인자로 사용하는 것이 좋음. 예를 들면, 함수 호출 시 에러를 던지고 말지를 결정한다는 형식으로....