요약 데코레이터를 사용했을 때, 데코레이터 함수는 원본 함수의 정보와 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(): ..
요약 위치 기반 인자를 의도치 않게 키워드 인자로 사용하는 경우, 함수 호출부와 강하게 결합함. 이 때, 위치 기반 인자의 이름 변화가 이 함수를 호출하는 쪽에도 의도치 않게 영향을 줄 수 있음. 위치 기반 인자, 키워드 기반 인자를 강제할 수 있음. 함수 호출부의 / 앞에 있는 인자들은 위치 기반 인자로만 사용됨. 함수 호출부의 * 뒤에 있는 인자들은 키워드 인자로만 사용됨. 함수 호출부의 /와 * 사이에 있는 인자들은 위치 + 키워드 인자로 둘다 사용될 수 있음. 함수 호출부에서 키워드 기반 인자를 사용하면, 인자의 뜻을 이해하기 쉬워 가독성이 좋아짐. 함수 내에서 옵션으로 사용하는 변수는 키워드 기반 인자로 사용하는 것이 좋음. 예를 들면, 함수 호출 시 에러를 던지고 말지를 결정한다는 형식으로....
요약 클로저는 자유변수를 참조하는 함수다. 파이썬의 변수 참조는 다음 순서로 이루어진다 함수가 선언된 내부 영역 함수를 둘러싼 영역 모듈 빌트인 영역(len, str 등이 선언된) 변수 참조 순서를 고려해서 필요한 경우 nonlocal 키워드를 이용해 자유변수임을 알려줘야한다. 그렇지 않으면 기대하지 않은 방식으로 동작한다. nonlocal 키워드는 가급적이면 적게 써야한다. nonlocal 키워드 선언 부분과 변수가 실제로 사용되는 부분이 멀어지면 이해하기 어려운 코드가 되기 때문이다. 이펙티브 파이썬 Item 21. 변수 영역과 클로저의 상호작용 방식을 이해하라 # helper는 클로저가 됨. def sort_priority(values, group): def helper(x): if x in gro..
요약 try / except / else / finally절의 용도를 잘 이해하고 사용해라. finally : 예외가 발생하더라도 자원 정리를 해야 할 필요가 있을 때 사용한다. 파일을 닫는 작업 else : try가 성공했다고 가정하고 다음 작업을 할 때 사용해라. try에서 발생하는 예외가 무엇인지 범위를 좁혀줄 수 있음. try ~ else를 같이 쓸 때 try는 예외가 발생할 수 있는 부분, else는 예외가 전혀 발생하지 않는 부분으로 나눠주는 용도로도 쓸 수 있음. (명시적으로) 성공흐름 : try → else → finally 실패흐름 : try → except → finally else 문의 효능 else는 다음 목적으로 사용한다. 코드에서 처리할 예외 / 위로 던질 예외를 명확하게 구분할..
요약 None을 반환하면 조건문에서 0, "", [] 같은 것들을 반환할 때와 동일하게 판단되므로 실수하기 쉬워짐. None을 반환한다면 다음 형태로 처리하는 것이 좋음. 명시적으로 None 체크하기 (is None) → 타입체커랑 사용하기 좋음. (연산 성공, 결과)를 튜플 형식으로 반환하기 → 사용자가 무시하기 쉬움. 명시적으로 예외를 던지고 Try / except / else를 사용하기 사용자가 문서를 읽지 않으면 런타임 에러에 대응하지 못할 수 있음. 그러나 빠른 실패라는 관점에서 좀 더 단단한 어플리케이션이 될 수도 있음. Item 20. None을 반환하기보다는 예외를 발생시켜라 if None: print('false' if 0: print('false') if []: print('false'..