[python] Python 코드를 PEP8과 호환되도록 변환하는 도구

Python 코드가 PEP8을 준수하는지 확인하는 도구가 있다는 것을 알고 있습니다. 예를 들어 온라인 서비스python 모듈 이 모두 있습니다.

그러나 내 Python 파일을 자체 포함 된 PEP8 유효한 Python 파일 로 변환 할 수있는 서비스 또는 모듈을 찾을 수 없습니다 . 아무도 있는지 아는 사람이 있습니까?
PEP8은 모두 코드의 모양에 관한 것이기 때문에 가능하다고 생각합니다.



답변

불행히도 “pep8 스토밍”(전체 프로젝트)에는 몇 가지 부정적인 부작용이 있습니다.

  • 많은 병합 충돌
  • 자식 비난을 깨다
  • 코드 검토를 어렵게 함

대안으로 (그리고 아이디어에 대한 @yp 덕분에 ) 마지막 커밋 / 브랜치 이후로 작업 한 줄만 autopep8s하는 작은 패키지를 작성했습니다.

기본적으로 프로젝트 를 찾은 것보다 조금 더 나아졌습니다 .

pip install pep8radius

작업을 master완료하고 커밋 할 준비가되었다고 가정합니다 .

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

또는 마지막 커밋 이후 커밋 한 새 줄을 정리하려면 :

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

기본적으로 pep8radiusautopep8을 git / hg diff 출력의 행에 적용 합니다 (마지막 공유 커밋에서 ).

이 스크립트는 현재 git 및 hg와 함께 작동합니다. 다른 것을 사용하고 이것이 작동하기 원한다면 댓글 / 문제 / PR을 게시하십시오 !


답변

autopep8 을 사용할 수 있습니다 ! 커피 한 잔을 만드는 동안이 도구 는 코드 의 의미 를 변경하지 않는 모든 성가신 PEP8 위반을 행복하게 제거합니다 .

pip를 통해 설치하십시오.

pip install autopep8

특정 파일에 적용 :

autopep8 py_file --in-place

또는 프로젝트에 (재귀 적으로) 자세한 옵션은 진행 상황에 대한 피드백을 제공합니다 .

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

참고 : 때때로 기본값 인 100 회 통과로는 충분하지 않습니다. 합리적으로 높고 가장 문제가 많은 파일을 제외한 모든 파일을 포착하므로 2000으로 설정했습니다 (해결 가능한 pep8 위반이 발견되면 통과가 중지됩니다) …

이 시점에서 다시 테스트하고 커밋을 수행하는 것이 좋습니다!

“완전한” PEP8 준수 를 원하는 경우 : 제가 사용한 한 가지 전술은 위와 같이 autopep8을 실행 한 다음 PEP8을 실행하여 나머지 위반 사항 (파일, 줄 번호 및 내용)을 인쇄하는 것입니다.

pep8 project_dir --ignore=E501

이를 개별적으로 수동으로 변경합니다 (예 : E712s-부울과 비교).

참고 : autopep8가 제공하는 --aggressive(이러한 의미 변화 위반 무자비하게 “수정”에 대한) 인수를,하지만 당신은 당신이 … 디버깅 할 수 있습니다 적극적으로 사용하는 경우 조심 (예에서 NumPy와 / 팬더 True == np.bool_(True)가 아니라 True is np.bool_(True)!)

각 유형 (이전 및 이후)의 위반 수를 확인할 수 있습니다.

pep8 --quiet --statistics .

참고 : E501 (너무 긴 줄)은 코드에 이러한 항목이 많을 수 있고 때로는 autopep8에 의해 수정되지 않는 특수한 경우라고 생각합니다.

예를 들어, 기술을 pandas 코드베이스에 적용했습니다 .


답변

@Andy Hayden은 autopep8에 대한 좋은 개요를 제공했습니다. 그 외에도 동일한 작업을 수행하는 pep8ify 라는 패키지가 하나 더 있습니다.

그러나 두 패키지 모두 Lint 오류 만 제거 할 수 있지만 코드 형식을 지정할 수는 없습니다.

little = more[3:   5]

위의 코드는 pep8ifying 후에도 동일하게 유지됩니다. 그러나 코드는 아직 좋지 않습니다. 코드가 PEP8과 호환되는 경우에도 코드를 형식화하는 yapf 와 같은 포맷터를 사용할 수 있습니다 . 위의 코드는

little = more[3:5]

때때로 이것은 당신의 수동 서식을 파괴합니다. 예를 들면

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

변환됩니다

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

그러나 일부 부분을 무시하도록 말할 수 있습니다.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

내 오래된 블로그 게시물에서 발췌 : 자동 PEP8 및 Python 코드 형식 지정!


답변

eclipse + PyDev를 사용하는 경우 PyDev의 설정에서 autopep8을 활성화 할 수 있습니다. Windows-> 환경 설정-> 검색 필터에 ‘autopep8’을 입력하십시오.

‘코드 형식화에 autopep8.py를 사용 하시겠습니까?’ -> 확인

이제 eclipse의 CTRL-SHIFT-F 코드 형식화는 autopep8을 사용하여 코드 형식을 지정해야합니다. 🙂

스크린 샷


답변

저는 파이썬과 코드 스타일을위한 다양한 도구에 대해 광범위한 연구를했습니다. 도구에는 두 가지 유형이 있습니다. 린터-코드를 분석하고 잘못 사용 된 코드 스타일에 대한 경고를 제공하고 수정 방법에 대한 조언을 표시하는 방법과 코드 포맷터-파일을 저장할 때 PEP 스타일을 사용하여 문서의 형식을 다시 지정합니다.

재 포맷은 더 정확해야하기 때문에-원하지 않는 무언가가 쓸모 없게되는 경우-PEP의 일부를 커버하지 않으면 린터가 훨씬 더 많이 표시됩니다.

예를 들어 모든 규칙에서 구성 할 수있는 Pylinter (모든 유형의 경고를 켜고 끌 수 있음), 검은 색 구성 할 수없는 구성 등 모두 구성에 대한 권한이 다릅니다.

다음은 몇 가지 유용한 링크와 튜토리얼입니다.

선적 서류 비치:

린터 (인기순) :

코드 포맷터 (인기순) :


답변

많이있다.

IDE에는 일반적으로 몇 가지 형식 지정 기능이 내장되어 있습니다. IntelliJ Idea / PyCharm이 수행하고 Eclipse 용 Python 플러그인도 마찬가지입니다.

여러 언어를 대상으로 할 수있는 포맷터 / 린터가 있습니다. https://coala.io 가 그 좋은 예입니다.

그런 다음 다른 답변에서 많은 것을 언급하는 단일 목적 도구가 있습니다.

자동 재 형식화의 한 가지 특정 방법은 파일을 AST 트리로 구문 분석 한 다음 (주석을 삭제하지 않고) 텍스트로 다시 덤프하는 것입니다 (원래 형식이 보존되지 않음을 의미 함). 그 예는 https://github.com/python/black 입니다.


답변