Python 스타일 : Python 코드를 정리하는 5 가지 도구

이론적으로 모든 Python 코드는 구문 상 정확하고 의도 한대로 실행되는 한 괜찮습니다. 실제로는 프로젝트 전반에 걸쳐 일관된 스타일을 채택하려고합니다. 가급적 Python의 고유 한 스타일 권장 사항에 따른 스타일입니다. 좋은 소식은이 작업을 손으로 할 필요가 없다는 것입니다. Python 생태계에는 Python 소스 코드가 스타일 규칙을 준수하도록하기 위해 고도로 집중된 도구부터 광범위한 도구에 이르기까지 다양한 도구가 포함되어 있습니다.

이 기사에서는 Python 코드 스타일을 확인하기위한 4 가지 인기있는 도구와 일관성을 유지하기 위해 코드 형식을 다시 지정하는 1 가지 도구를 살펴 보겠습니다. PyCharm 또는 Visual Studio Code와 같은 Python IDE는 기본적으로 또는 확장과 함께이를 지원하므로 개발 워크 플로에 쉽게 통합 할 수 있습니다.

파이 코드 스타일

PEP 8은 들여 쓰기 할 때 탭이나 공백을 사용할지 (4 개의 공백 사용, 문제 해결)부터 변수와 객체의 이름을 지정하는 방법에 이르기까지 Python의 코딩 규칙을 설명하는 문서입니다. Pycodestyle은 PEP 8 권장 사항에 대해 Python 코드를 확인하고 분석 된 코드가 사양을 벗어난 위치에 대한 보고서를 제공하는 Python 모듈입니다.

Pycodestyle은 문제에 대한 자동 수정을 제공하지 않습니다. 그것은 당신에게 있습니다. 그러나 Pycodestyle은 고도로 구성 가능하므로 특정 종류의 오류를 억제하거나 소스 트리의 특정 파일 만 구문 분석 할 수 있습니다. 그리고 Python을 지원하는 거의 모든 IDE는 Pycodestyle도 지원하므로 기능은 아니지만 범용 호환성을위한 쉬운 선택입니다.

많은 Python 코드 린터가 Python에서 모듈로 작동 할 수 있으며 Pycodestyle도 예외는 아닙니다. 예를 들어 테스트 스위트의 일부로 프로그래밍 방식으로 코드를 검증하는 데 사용할 수 있습니다.

최적 :  PEP 8 적합성의 기본 검증.

Autopep8

Autopep8은 Pycodestyle이 중단되는 지점을 선택합니다. Pycodestyle을 사용하여 변경해야 할 사항을 결정한 다음 제공된 제안에 따라 코드를 다시 형식화합니다. 기존 파일을 제자리에서 다시 포맷하거나 새 파일에 쓸 수 있습니다. Autopep8은 또한 Python 2에서 Python 3으로 변환 된 코드 또는 혼합 된 줄 끝 마커가있는 파일을 정리하는 것과 같이 발생할 수있는 다른 문제를 해결합니다. 그리고 Autoprep8을 프로그래밍 방식으로 사용하여 문자열로 제공된 코드를 다시 포맷 할 수 있습니다.

최적 : 파일을 PEP-8 규격으로 변환합니다.

플레이크 8

Flake8은 여러 Python linting 및 코드 스타일 도구를 단일 패키지에 포함합니다. 구문 검사를 사용하여 기본 오류를 감지하는 PyFlakes 및 위에서 논의한 Pycodestyle과 함께 Flake8은 프로젝트의 "순환 적 복잡성", 즉 프로그램에서 발견 된 독립 코드 경로의 수를 확인하는 추가 도구를 제공합니다. . (예를 들어 기본 모듈이 너무 기본이되지 않도록하려면 순환 복잡성이 잠재적으로 유용한 측정 항목입니다.) 각 분석이 끝날 때 Flake8은 분석 된 코드의 전체 품질에 대한 백분위 수 측정 항목을 제공합니다. 코드베이스에서 가장 문제가되는 부분을 빠르게 파악하는 방법입니다.

또한 Flake8에는 플러그인 시스템이 있으므로 linting은 Git 커밋 또는 기타 자동화 된 작업과 결합 될 수 있습니다.

최적 :  특정 권장 사항과 함께 전체 코드 품질 평가.

Pylint

Pylint는 아마도 가장 널리 사용되고 지원되는 Python linter 일 것입니다. 다른 것들과 마찬가지로 Python 코드에서 코딩 표준의 오류와 편차를 찾고 이러한 실수를 수정하는 방법에 대한 변경 사항을 제공합니다.

Pylint 틀림없이 또한 가장입니다 completist 심지어 특정 상황에 관련되지 않을 수도 있습니다 일부 코드와 수많은 문제에 대해 경고 할 수 있다는 점에서, 코드 체커. 결과는 장황 할 수 있지만 특정 프로젝트의 특성에 맞게 조정할 수도 있습니다.

Pylint는 점진적으로 더 문제가되는 5 가지 문제 클래스를 찾습니다. “컨벤션”은 PEP 8 또는 Python의 다른 일관성 규칙을 위반하는 것입니다. "리팩터링"은 코드 냄새, 일반적인 실수 또는 더 효율적이거나 덜 혼란스럽게 재 작업 될 수있는 코드를 나타냅니다. 예를 들어주기적인 가져 오기 또는 공통 기능으로 압축 될 수있는 유사한 행이 너무 많은 파일이 있습니다. "경고"는 연결할 수없는 코드 ( return 함수에서 a 이후의 모든 것 ) 또는 __init__ 메서드가 누락 된 클래스  와 같은 Python 관련 문제  입니다. "오류"는 정의되지 않은 변수와 같은 실제 코드 버그이고 "치명적인"문제는 Pylint가 실행되지 못하게하는 문제입니다.

다시 말하지만, Pylint를 가장 유용하고 무겁게 만드는 것은 제공하는 피드백의 양입니다. 좋은 소식은 튜닝을 원하는 사람들을 위해 Pylint의 상세 도와 세분성을 프로젝트별로 또는 파일별로 수정할 수 있다는 것입니다. 또한 너무 복잡한 코드 (긴 체인 if등) 또는 더 이상 사용되지 않는 내장 기능에 대한 linting 과 같은 특정 종류의 검사를 추가하는 다양한 Pylint 플러그인을 그릴 수 있습니다  .

최적 :  오버로드를 방지하기 위해 설정을 조정하는 데 신경 쓰지 않는다고 가정하고 코드에 대한 수프 투 너트 품질 관리.

검정

Black은 린터 또는 코드 분석 도구가 아니지만 더 나은 코드 품질을 보장하는 방법으로 스타일을 적용하는 도구입니다. 이러한 이유로 여기에 설명 된 다른 도구와 함께 편안하게 배치됩니다. 많은 기본 스타일 오류를 선제 적으로 피할 수있는 방법이기 때문입니다.

Black은 "완벽한 코드 포맷터"로 설명되며 라인 길이를 제외하고 설정 가능한 옵션이 없기 때문에 타협하지 않습니다. Black은 여러 줄 표현과 같은 까다로운 문제를 처리하기위한 내부 규칙을 사용하여 Python 코드를 단일하고 일관 적이며 읽기 쉬운 스타일로 재구성하므로 이러한 코드도 일관되게 다시 형식화됩니다.

Black 사용의 장점 중 하나는 포맷에 대한 모든 분쟁을 해결하여 "bikeshedding"을 제거하고 linter 출력시 노이즈를 덜 발생 시킨다는 것입니다. 프로젝트의 코드 형식을 지정하는 방법에 대해 논쟁 할 필요가 없으며 많은 부분을 수동으로 수행 할 수도 있습니다. Black 만 사용하면 끝납니다. Black으로 코드를 자동으로 포맷하도록 많은 IDE를 구성 할 수도 있습니다. 주장 된 또 다른 이점은 git 주어진 파일에 대한 변경 사항의 수를 줄이므로 커밋을 더 깔끔하게 만든다는  것입니다.

최상의 대상 : 코드베이스를 기본 문체 적합성 으로 일괄 처리 합니다.

Python으로 더 많은 작업을 수행하는 방법 :

  • Python 목록 데이터 유형으로 작업하는 방법
  • BeeWare Briefcase로 Python 앱을 패키징하는 방법
  • Anaconda를 다른 Python과 나란히 실행하는 방법
  • Python 데이터 클래스를 사용하는 방법
  • Python에서 비동기 시작하기
  • Python에서 asyncio를 사용하는 방법
  • Python 비동기 점검을위한 3 단계
  • PyInstaller를 사용하여 Python 실행 파일을 만드는 방법
  • Cython 튜토리얼 : 파이썬 속도를 높이는 방법
  • Python을 현명하게 설치하는 방법
  • Poetry로 Python 프로젝트를 관리하는 방법
  • Pipenv로 Python 프로젝트를 관리하는 방법
  • Virtualenv 및 Venv : Python 가상 환경 설명
  • Python virtualenv 및 venv해야 할 일과하지 말아야 할 일
  • Python 스레딩 및 하위 프로세스 설명
  • Python 디버거를 사용하는 방법
  • timeit을 사용하여 Python 코드를 프로파일 링하는 방법
  • cProfile을 사용하여 Python 코드를 프로파일 링하는 방법
  • Python을 JavaScript로 변환하는 방법 (그리고 다시)