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


113

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

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


1
코드를 PEP8 호환 코드로 변환하는 도구가 없다고 생각합니다. PEP8에는 변수 이름 지정 규칙도 포함되어 있으므로 이러한 도구가 존재하면 변수 이름도 변경되어 자신의 코드를 이해하지 못할 수도 있습니다.
Ashwini Chaudhary

1
@AshwiniChaudhary 좋은 점입니다. 변수 이름을 변경하면 이미 코드를 사용하는 다른 사용자에게 영향을 미칠 수 있다는 점을 언급 할 가치가 있습니다. 따라서 항상 좋은 생각은 아닙니다. (autopep8이 작업을 수행하지 않습니다.)
앤디 헤이든에게

답변:


38

불행히도 "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을 게시하십시오 !


2
그게 내 마음에 드는 Windows에서 편집자로 일 아주 좋은 사업은 ... 난 ... 같은 목적을 위해 플러그인 메모장 ++를 만드는 방법에 대해 생각하고
kmonsoor

1
@kmonsoor 좋은 생각, 나는 편집기 플러그인에 대해 생각하지 않았습니다! CLI 외부에서 쉽게 사용할 수 있도록 github에서 알려주세요. 몇 가지 (해결 가능한) 문제가 있습니다.
Andy Hayden

여기에서 흥미로운 편집기 플러그인 목록을 찾았습니다. github.com/jcrocholl/pep8/wiki/RelatedTools , Notepad ++에는 운이
없었지만

1
방금 다른 플러그인 "Python Script"를 기반으로 Notepad ++와 Autopep8을 연결하는 스크립트를 만들었습니다. 그러나 작동합니다. 여기 Plz 확인 : bit.ly/pep8_tonizer
kmonsoor

185

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 코드베이스에 적용했습니다 .


@hayden 이것이 얼마나 신뢰할 수 있는지, 그리고 그것이 도입하는 이상한 문제에 대한 automagic 수정의 비율에 대한 의견이 있습니까?
Marius

@Marius 나는 이것을 팬더 코드 (꽤 큰)에서 사용했으며 이상한 문제를 보여주지 않았고 의미 를 변경하는 코드를 변경하지 않을 것입니다 .이를 언급하기 위해 내 대답을 업데이트했습니다. 이전에는 Sphinx의 hashbang에 문제가있었습니다 (이제 PEP8의 버그가 수정 됨).
Andy Hayden 2013 년

2
댓글에 Strunk와 White가 적용 되나요?
에릭

1
2017 년 10 월 25 일 부터이pep8 답변에 언급 된 패키지의 이름이 github.com/PyCQA/pycodestyle/releases/tag/1.7.1pycodestyle
hb20007

8

@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 코드 형식 지정!


2
입니다 little = more[3: 5]pep8 (라이브러리)의 버그? yapf는 확실히 미래이며, 그 뒤에있는 알고리즘 (기본적으로 모든 서식 옵션의 그래프에서 가장 짧은 경로)은 매우 우아한 솔루션이며 표준 서식뿐만 아니라 버그도 적을 것입니다.
Andy Hayden

@AndyHayden 누락 된 기능인 것 같습니다. E225를 수정하지 않습니다
ChillarAnand

5

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

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

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

스크린 샷


3

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

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

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

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

선적 서류 비치:

린터 (인기순) :

코드 포맷터 (인기순) :


1

많이있다.

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.