파이썬 들여 쓰기를 수정하는 방법


264

들여 쓰기가 일치하지 않는 Python 코드가 있습니다. 문제를 더욱 악화시키기 위해 탭과 공백이 많이 혼합되어 있으며 공간 들여 쓰기도 보존되지 않습니다.

코드가 예상대로 작동하지만 유지 관리가 어렵습니다.

어떻게 들여 쓰기 수정 (같은 수 있습니다 HTML 단정을 하지만, 파이썬) 코드를 한방울 흘리지 않고?


당신은 reindent.py module-- 사용하는 방법에 입력이 링크를 검토하고 제공 할 수 stackoverflow.com/questions/12132481/installing-reindent-python/...
user1050619

@ andy-hayden에 의해 아래 언급 된 바와 같이이 관련 질문을보십시오-기본적으로 autopep8들여 쓰기 및 훨씬 더 많은 것을 제공합니다 : stackoverflow.com/questions/14328406/…
Pierz

2
이것은 미친 듯이 유용한 질문입니다. 저는 이것을 자주해야합니다. "도구를 추천하는 방법"만큼 "도구를 추천하는 것"이 ​​아닙니다.
Andy Hayden

답변:


282

Python 설치 디렉토리에 있는 reindent.py스크립트를 사용하십시오 Tools/scripts/.

4 칸 들여 쓰기를 사용하고 하드 탭 문자를 사용하지 않도록 Python (.py) 파일을 변경하십시오. 또한 줄 끝에서 여분의 공백과 탭을 잘라 내고 파일 끝에서 빈 줄을 제거하십시오. 또한 마지막 줄은 줄 바꿈으로 끝나야합니다.

자세한 사용법 지침은 해당 스크립트를 살펴보십시오.


51
불행히도 데비안과 우분투에서 일반적인 파이썬 설치의 일부는 아닙니다. python-examples패키지 로 분할됩니다 .
ephemient 2016 년

16
우수한! 데비안과 우분투 사용자가해야 할 일은 그 패키지를 얻는 것입니다. 또는 스크립트는 svn.python.org/view/python/trunk/Tools/scripts/…에 있습니다.
Alex Martelli 2016 년

9
@Shay Erlichmen : "python -tt yourscript.py"시도
nosklo

8
Fedora / RedHat / CentOS 사용자는 "python-tools"패키지를 설치해야합니다.
Cristian Ciupitu

26
ephemient의 의견에 추가하기 만하면 일단 python-examples설치되면 reindent를 찾을 수 /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py있습니다.
Larry Hastings

59

Vim을 사용하는 경우를 참조하십시오 :h retab.

                                                        * : ret * * : retab *
: [범위] ret [ab] [!] [new_tabstop]
                        공백을 포함하는 모든 일련의 공백을 바꿉니다.
                        새로운 공백 문자를 사용한 <Tab>
                        주어진 tabstop 값. 새 것을 지정하지 않으면
                        tabstop 크기 또는 0, Vim은 현재 값을 사용합니다
                        '탭 스톱'.
                        'tabstop'의 현재 값은 항상
                        기존 탭의 너비를 계산하십시오.
                        !를 사용하면 Vim은 일반 문자열 만 대체합니다.
                        적절한 곳에 탭이있는 공간.
                        '확장 탭'을 켜면 Vim은 모든 탭을
                        적절한 수의 공간.
                        이 명령은 'tabstop'을 새로운 값으로 설정합니다.
                        전체 파일에서 수행되는 경우 (기본값)
                        눈에 띄는 변경을하지 않아야합니다.
                        주의 :이 명령은 모든 <Tab> 문자를 수정합니다
                        C 프로그램에서 문자열 내부. "\ t"를 사용하여 피하십시오
                        이것은 (어쨌든 좋은 습관입니다).
                        ": retab!" 또한 일련의 공백을 다음과 같이 변경할 수 있습니다.
                        printf ()를 망칠 수있는 <Tab> 문자
                        {가 아닌 Vi}
                        | + ex_extra | 에 기능이 비활성화되었습니다
                        컴파일 시간.

예를 들어

: ret

모든 탭이 공백으로 확장됩니다.

당신은 할 수 있습니다

: se et ": : set expandtab의 약자

새 줄에서 리터럴 탭을 사용하지 않도록합니다.


Vim을 사용하지 않는 경우

perl -i.bak -pe "s / \ t / ''x (8-pos () % 8) / eg"file.py

는 8 문자마다 탭이 중지된다고 가정 할 때 탭이 공백으로 바뀝니다 file.py(원본 file.py.bak은 경우에 따라). 탭 스탑이 4 칸 간격 인 경우 8을 4로 바꿉니다.


2
잘 작동했습니다. 이것은 탭 들여 쓰기 믹스 업을 수정하는 가장 쉬운 방법입니다.
Srikant 2016 년

가장 쉬운 방법은 아닙니다.
CONvid19

52

autopep8 이이 작업 을 수행하도록 도달 합니다.

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

참고 : E101 및 E121 은 pep8 들여 쓰기입니다 ( --select=E1E1로 시작하는 모든 들여 쓰기 관련 문제를 해결하기 위해 전달할 수 있다고 생각합니다 ).

재귀 플래그를 사용하여 전체 프로젝트에이를 적용 할 수 있습니다.

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

Python 코드를 PEP8 호환으로 변환하는 도구 도 참조하십시오 .


이것은 굉장하다 ... 나는 파이썬을위한 루비의 rubocop와 같은 도구를 찾고있다
OkezieE

1
autopep8구문이 올바르지 않으면 실패합니다. python -tt <file.py>
Nishant

47

autopep8 -i script.py

autopep8 사용

autopep8 PEP 8 nullstyle가이드 에 맞게 Python 코드를 자동으로 형식화합니다 . pep8유틸리티를 사용하여 nullcode포맷해야 할 부분을 ​​결정합니다 . autopep8에서 nullformatting보고 할 수있는 대부분의 문제를 해결할 수 있습니다 pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file

나는 "import os"와 그 앞에 4 개의 공백을 가진 단 하나의 라인 코드를 가지고 있지만 그것을 들여 쓰기하지 않습니다 .... 어떤 이유
pkm

3
@pkm 4 개의 공간 (또는 4의 배수 인 들여 쓰기)은 PEP8의 일부입니다.
rbaleksandar

13

Vim을 사용하면을 Esc누른 다음 입력 하는 것보다 더 복잡하지 않아야합니다 .

:%s/\t/    /g

... 변경하려는 파일에서. 모든 탭을 4 개의 공백으로 변환합니다. 간격이 일치하지 않으면 더 어려워집니다.


11
원래 코더를 추적하고 향상된 심문 기술을 적용 할 수 있습니까? 일관성이없는 들여 쓰기 코드보다 더 나쁜 것은 없습니다.
벤 휴즈

3
일관성 들여 @ 벤 : 그 사람에서 우리의 문제의 하나입니다
셰이 Erlichmen


5

대부분의 UNIX 계열 시스템에서는 다음을 실행할 수도 있습니다.

expand -t4 oldfilename.py > newfilename.py

탭을 4 이외의 다른 공백으로 바꾸려면 명령 줄에서 숫자를 변경하십시오. 원래 파일 이름을 유지하면서 한 번에 많은 파일로이를 수행하는 쉘 스크립트를 쉽게 작성할 수 있습니다.


1
동일한 파일을 사용하면 작동하지 않으며 빈 파일로 남겨 두지 만이 답변은 실제로 작동하며 탭을 공백으로 변환해야 할 때 사용합니다. 누구나 공감대를 설명 할 수 있습니까? +1하겠습니다.
S. Kerdel

덮어 쓴 파일을 복구 할 수있는 방법이 있습니까? 위의 방법을 사용했고 내 코드의 가치는 facepalm 사라졌습니다 . 감사합니다
Simas

4

나처럼 게으른 경우 엉망 들여 쓰기를위한 자동 수정 도구가있는 Wingware Python IDE의 평가판을 다운로드 할 수도 있습니다. 꽤 잘 작동합니다. http://www.wingware.com/


4

모듈이 누락되어 reindent 스크립트가 작동하지 않았습니다. 어쨌든, 나는이 sed명령이 나를 위해 완벽하게 작동하는 것을 발견했습니다 .

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

2
잘못된 옵션 -r.
HelloWorld

2

이맥스를 사용해보십시오. 파이썬에서 필요한 들여 쓰기를 잘 지원합니다. 이 링크를 확인하십시오 http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm


2
python-mode는 Python을 작성하는 데 좋지만 링크 의 기존 파일에서 들여 쓰기 를 수정 하는 방법에 대한 설명은 없습니다 .
ephemient 2016 년

5
Mx untabify는 emacs에서 탭을 공백으로 바꿀 것입니다
Paul Hildebrandt

링크가 (효과적으로) 끊어졌습니다. 제목이 "C 초보자 용 프로그래밍 언어" (!) 인 페이지로 리디렉션됩니다 .
Peter Mortensen


0

이 문제에 대한 간단한 해결책이 있습니다. 먼저 ": retab"을 입력 한 다음 ": retab!"을 입력하면 모든 것이 정상입니다.


1
:retab어떤 상황에서 " "를 입력하십시오 . 에서 ?
Peter Mortensen

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