패키지 스타일 유지하기

Python 패키지 개발하기

James Fulton

Climate informatics researcher

flake8 소개

  • 표준 Python 스타일: PEP8
  • 스타일 가이드는 코드 배치를 규정함
  • pytest는 버그를 찾음
  • flake8은 스타일 오류를 찾음
Python 패키지 개발하기

flake8 실행하기

정적 코드 검사기 - 코드를 읽지만 실행하지 않음

flake8 features.py
features.py:2:1: F401 'math'가 import되었으나 사용되지 않음
..
<filename>:<line number>:<charcter number>:<error code> <desciption>
Python 패키지 개발하기

출력을 활용해 품질 개선

 1. import numpy as np
 2. import math
 3.
 4. def mean(x):
 5.    """Calculate the mean"""
 6.    return np.mean(x)
 7. def std(x):
 8.     """Calculate the standard deviation"""
 9.     mean_x = mean(x)
10.     std = mean((x-mean(x))**2)
11.     return std
12. 
flake8 features.py
2:1: F401 'math'가 import되었으나 사용되지 않음

4:1: E302 빈 줄 2개가 필요, 1개만 있음
7:1: E302 빈 줄 2개가 필요, 0개임
5:4: E111 들여쓰기가 4의 배수가 아님 6:4: E111 들여쓰기가 4의 배수가 아님
9:5: F841 지역 변수 'mean_x'가 할당되었으나 사용되지 않음
Python 패키지 개발하기

출력을 활용해 품질 개선

 1. import numpy as np
 2.
 3.
 4. def mean(x):
 5.     """Calculate the mean"""
 6.     return np.mean(x)
 7. 
 8. 
 9. def std(x):
10.     """Calculate the standard deviation"""
11.     mean_x = mean(x)
12.     std = mean((x - mean_x)**2)
13.     return std
14. 
flake8 features.py


Python 패키지 개발하기

의도적으로 규칙 깨기

quadratic.py

4. ...
5. quadratic_1 = 6 * x**2 + 2 * x + 4;
6. quadratic_2 = 12 * x**2 + 2 * x + 8
7. ...
Python 패키지 개발하기

의도적으로 규칙 깨기

quadratic.py

4. ...
5. quadratic_1 =  6 * x**2 + 2 * x + 4;
6. quadratic_2 = 12 * x**2 + 2 * x + 8
7. ...
flake8 quadratic.py
quadratic.py:5:14: E222 연산자 뒤에 공백이 여러 개
quadratic.py:5:35: E703 문장이 세미콜론으로 끝남
Python 패키지 개발하기

의도적으로 규칙 깨기

quadratic.py

4. ...
5. quadratic_1 =  6 * x**2 + 2 * x + 4; # noqa
6. quadratic_2 = 12 * x**2 + 2 * x + 8
7. ...
flake8 quadratic.py

Python 패키지 개발하기

의도적으로 규칙 깨기

quadratic.py

4. ...
5. quadratic_1 =  6 * x**2 + 2 * x + 4; # noqa: E222
6. quadratic_2 = 12 * x**2 + 2 * x + 8
7. ...
flake8 quadratic.py
quadratic.py:5:35: E703 문장이 세미콜론으로 끝남
Python 패키지 개발하기

flake8 설정

주석 없이 스타일 위반 무시하기

flake8 --ignore E222 quadratic.py
quadratic.py:5:35: E703 문장이 세미콜론으로 끝남
flake8 --select F401,F841 features.py
2:1: F401 'math'가 import되었으나 사용되지 않음
9:5: F841 지역 변수 'mean_x'가 할당되었으나 
     사용되지 않음
Python 패키지 개발하기

setup.cfg로 패키지 설정 선택

설정을 저장할 setup.cfg 생성

패키지 파일 트리

.
|-- example_package
|   |-- __init__.py
|   `-- example_package.py
|-- tests
|   |-- __init__.py
|   `-- test_example_package.py
|-- README.rst
|-- LICENSE
|-- MANIFEST.in
`-- setup.py
Python 패키지 개발하기

setup.cfg로 패키지 설정 선택

설정을 저장할 setup.cfg 생성

[flake8]


ignore = E302
exclude = setup.py
per-file-ignores = example_package/example_package.py: E222

패키지 파일 트리

.
|-- example_package
|   |-- __init__.py
|   `-- example_package.py
|-- tests
|   |-- __init__.py
|   `-- test_example_package.py
|-- README.rst
|-- LICENSE
|-- MANIFEST.in
|-- setup.py
`-- setup.cfg
Python 패키지 개발하기

패키지 전체 검사

$ flake8

패키지 파일 트리

.
|-- example_package
|   |-- __init__.py
|   `-- example_package.py
|-- tests
|   |-- __init__.py
|   `-- test_example_package.py
|-- README.rst
|-- LICENSE
|-- MANIFEST.in
|-- setup.py
`-- setup.cfg
Python 패키지 개발하기

필터는 최소로 사용하기

필터 최소화

  1. # noqa : <code>
  2. # noqa
  3. setup.pyper-file-ignores
  4. setup.cfgexclude, ignore

필터 최대화

Python 패키지 개발하기

연습해 봅시다!

Python 패키지 개발하기

Preparing Video For Download...