프로젝트 구조는 단순해야 하고 패키지와 계층을 적절히 사용하는 것이 좋다.
단위 테스트를 패키지 디렉터리 바깥에 두는 것은 흔히 하는 실수다. 테스트들은 우리 프로그램의 서브패키지로 포함되어야 한다.
그래야 setuptools 나 다른 패키징 라이브러리에 의해 최상위 모듈 테스트로 설치 되지 않는다.
테스트 코드도 패키지와 함께 설치되고 다른 패키지가 단위 테스트를 작성하는 데 사용 될 수 있다.
알파 릴리즈 : 불와전한 릴리즈
베타 릴리즈 : 기능적으론 완전하나 버그가 있을지도 모른다.
c, rc : 최종후보 버전, 즉 특별한 버그가 없다면 제품이 될 수 있는 버전. rc 와 c 는 의미가 같지만 둘다 사용될 경우 rc 릴리즈가 c 릴리즈보다 더 새로운 것을 의미한다.
sys.modules 모듈 객체를 가지는 딕셔너리
sys.builtin_modules_names : 기본으로 제공되는 모듈로 들여오기를 하지 않아도 바로 사용가능
표준라이브러리
Alembic 을 사용해서 데이터베이스 마이그레이션을 하고 있다.
namedtuple 은 속성 이름을 통해 접근하게 해주기 때문에 추후에 필효아면 일반 클래스로 바꾸는 것도 쉽다.
ChainMap 스택 가능한 네임스페이스를 만들어 준다. 템플릿 렌더링을 위해 콘텍스트를 구현할 때나 우선순위가 다른 여러 소스에서 온 설정 값들을 관리할 때 유용하다.
변화를 강조하기 위해 스핑크스 마크업을 쓰면 좋다. 문서화를 할 떄 이 함수가 더는 쓰이지 않으며 새 함수로 대체되었음을 알리고 어떻게 이전 코드를 바꿀수 있는지 분명히 해야한다.
warnings 모듈
API 의 진화와 중단 그리고 제거 우선 원칙
- 사용자들이 코드 변경에 적응하는데 얼마나 어려운가
- 수정을 하면 유지 보수가 쉬워지는가
- 수정 후에 API 의 일관성이 좋아지는가
- 이 수정 후 사용자들이 얻는 이득은 무엇인가
PyPI 를 통해 문서를 발행, Read the Docs에 올리는 것.
스핑크스의 'Cloud' 테마를 WSME 에 사용
http://sphinx-doc.org
reST 포맷
설치 패키징 setuptools
가상환경 모듈 표준라이브러리
python3.3 -m venv
픽스처 fixtures
테스트 전에 구축되고 테스트 후에 지워져야 하는 데이터
예) 애플리케이션 설정을 나타내는 객체가 필요할면 테스트가 실행되기 전에 초기화하고 테스트를 수행하고 나면 원래 값으로 돌려놓는다. 테스트 전에 임시파일을 만들고 삭제하는 경우
커버리지 coverage
코드 중 어떤 부분이 테스트 되었고 어떤 부분이 아닌지
'죽은 코드'가 될 가능성이 있는 부분
nosetests --cover-package=ceilometoer --with-coverage tests/test_pipeline.py
tox 파이썬에서 테스트를 실행하는 방법을 자동화 하고 표준화 하는 것.
데코레이터
다른 함수를 인자로 받아서 새롭게 변형된 함수로 바꾸는 함수
메서드
바운드 / 언바운드
클래스의 속성으로 저장되는 함수
객체를 생성하지 않고 메소드를 호출하는 경우 - 언바운드 (python3 에서는 개념이 없어짐)
Pizza.get_size
Pizza.get_size(Pizza(42))
Pizza(42).get_size
@staticmethod
클래스에 속한 메서드지만 클래스 인스턴스를 사용하지 않는 메서드
해당 메서드는 객체 상태에 의존적이지 않음을 알 수 있다.
@classmethod
인스턴스가 아닌 클래스에 바운드 되는 메서드
Pizza.from_fridge(myfridge) Fridge 객체를 넘겨 재료를 가진 새 피자 객체를 만들 수 있따.
from_fridge(cls, fridge): return cls(fridge.get_chees() + fridge.get_vegetables())
super()
사실 생성자이고 호출할 때마다 super 객체를 인스턴스화하고 있음
super 는 하나 또는 두개의 인자를 가진다. 첫번째는 클래스이고, 두번째는 서브클래스 이거나 또는 첫번째 인자의 인스턴스 이다.
이 생성자가 돌려주는 객체는 첫번쨰 인자의 부모 클래스의 프락시처럼 동작한다.
함수형프로그래밍
입력을 받으면 상태를 가지거나 리턴 값에 관련되지 않은 어떤 것도 수정하지 않고 출력을 만들어 낸다. 이러한 이상을 따르는 함수들을 '순수한 함수형'이라고 부른다.
증명가능성, 모듈화, 간결성, 동시성, 테스트 가능성
inspect.getgeneratorstate
제너레이터의 현재 상태를 알려주어서 제네레이터가 처음 시작되길 기다리는 것인지 GEN_CREATED, 인터프리터에 의해 실행중인지 GEN_RUNNING, next() 호출에 의해 재기되길 기다리고 있는지(GET_SUSPENDED), 아니면 실행을 완료했는지 GET_CLOSED 알수 있따.
파이썬에서는 제네레이터는 함수가 어떤 것을 yeild 할 떄 스택의 레퍼런스를 가지고 있다가 next() 가 다시 호출될때 이 스택을 복원한다.
def first(predicate, items):
for item in items:
if predictate(item):
return item
first(lambda x:x >0, [-1, 0, 1, 2])
-> next(filter(lambda x:x>0, [-1, 0, 1, 2]))
Hy 는 리스프와 흡사한 언어를 파싱하여 보통 파이썬 AST 로 바꾸기 때문에 파이썬 생태계와 완전히 호환된다.
프로파일링 cProfile
각 함수가 얼마나 호출되었느지, 실행에 얼마나 걸리는지, -s 옵션을 쓰면 다른 필드를 기준으로 정렬할수 있다.
앞의 코드에 대한 다양한 변종을 구현한것이나 바이너리 트리아 레드블랙 트리 구조 같이 많은 데이터 구조에 대한 라이브러리들이 이미 존제한다. blist(http://pypi.python.org/pypi/blist) 와 bintree(https://pypi.python.org/pypi/bintrees/)
네임드튜플과 슬롯
mamory_profiler 메모리 사용 검사
메모이제이션
결과를 캐싱하여 함수 호출 속도를 높여주는 기법
pypy 파이썬 인터프리터를 파이썬으로 구현한 것
버퍼 프로토콜을 사용한 제로 카피
아주 큰 바이너리 파일을 읽는 프로그램
buffer protocol
새 접속이 만들어질 떄마다 새 프로세스를 포크 한다. mutiprocessing 모듈 같은 것을 사용한다.
새 접속이 만들어질 때마다 새 스레드를 만든다. threading 모듈을 사용한다.
이벤트 루프에 이 새접속을 추가하고 이벤트가 발생하면 반응하게 한다.
'Software Science' 카테고리의 다른 글
100년된 IBM, 10년된 Agile (0) | 2023.03.08 |
---|---|
UML Class Diagram 을 자바 소스로 구현 기준 (0) | 2023.03.08 |
[Spark] Learning Spark (0) | 2018.07.01 |
[Python] 안녕파이썬 (강의) (0) | 2018.04.19 |
[Linux] gvim 환경 설정 하기 (0) | 2018.04.01 |