파이썬에서 "예기치 않은 들여 쓰기"로 무엇을해야합니까?


117

파이썬에서 "예기치 않은 들여 쓰기"오류를 어떻게 수정합니까?


4
오류를 생성하는 코드 조각은 문제를 더 잘 이해하는 데 도움이됩니다. 일부 코드를 포함하도록 질문을 편집하십시오.
RBerteig

7
이것은 나에게 공백 문제처럼 들리므로 코드 샘플은 쓸모가 없습니다.
James McMahon

모호한 질문이며 선택한 답변이 없습니다.
rafael.js

"오류를 어떻게 수정합니까 ..."? 발생한 위치를 식별하고 오류 원인을 수정합니다. 이 경우, 특정 줄의 들여 쓰기를 Python이 예상하는 것처럼 보이게
함으로써

답변:


132

파이썬은 줄의 시작 부분에 공백을 사용하여 코드 블록이 시작되고 끝나는시기를 결정합니다. 얻을 수있는 오류는 다음과 같습니다.

예기치 않은 들여 쓰기입니다. 이 코드 줄에는 이전보다 시작 부분에 더 많은 공백이 있지만 이전 코드 줄은 하위 블록의 시작이 아닙니다 (예 : if / while / for 문). 블록의 모든 코드 줄은 정확히 동일한 공백 문자열로 시작해야합니다. 예를 들면 :

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

이것은 파이썬을 대화식으로 실행할 때 특히 일반적입니다. 명령 앞에 추가 공백을 두지 마십시오. (예제 코드를 복사하여 붙여 넣을 때 매우 귀찮습니다!)

>>>   print "hello"
IndentationError: unexpected indent

들여 쓰기는 외부 들여 쓰기 수준과 일치하지 않습니다. 이 코드 줄은 시작 부분에 이전보다 적은 공백이 있지만 똑같이 일부가 될 수있는 다른 블록과 일치하지 않습니다. 파이썬은 그것이 어디로 가는지 결정할 수 없습니다. 예를 들어, 다음에서 최종 인쇄물이 if 절의 일부 여야합니까?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

들여 쓰기 된 블록이 필요합니다. 이 코드 줄은 시작 부분에 이전과 같은 수의 공백이 있지만 마지막 줄은 블록을 시작할 것으로 예상되었습니다 (예 : if / while / for 문, 함수 정의).

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

아무것도하지 않는 함수를 원한다면 "no-op"명령 패스를 사용 하세요 :

>>> def foo():
...     pass

탭과 공백을 혼합하는 것은 허용되지만 (적어도 Python 버전에서는) Python은 탭이 8 자 길이라고 가정하므로 편집기와 일치하지 않을 수 있습니다. 탭에 "아니오"라고 말하면됩니다. 대부분의 편집자는 공백으로 자동 대체되도록 허용합니다.

이러한 문제를 피하는 가장 좋은 방법은 하위 블록을 들여 쓸 때 항상 일관된 수의 공백을 사용하고 이상적으로는 문제를 해결하는 좋은 IDE를 사용하는 것입니다. 이렇게하면 코드를 더 쉽게 읽을 수 있습니다.


7
좋은 설명. 그 외에도 메모장 ++에서 '탭'및 '스페이스 바'와 공백을 혼합하여 '공백'을 '탭'으로 바꾸고 수정하면 예기치 않은 오류가 발생했습니다.
José Rosas Sáenz 2015

2
@ JoséRosasSáenz 귀하의 의견은 나에게 너무 많은 문제를 저장
user3726345

한 가지 추가 원인은 조항 의 except일부 가 누락 된 것 try입니다. 코드는 올바로 보이지만 (들여 쓰기되지 않은 줄은 try블록 외부에 있음을 의미 함 ) Python은이를 '예기치 않은 들여 쓰기'오류로보고합니다. 이은을 첨가하여 고정 except하여, 아마도 pass(같은 여기 )
dumbledad

@dumbledad 어떤 버전의 파이썬에서 볼 수 있습니까? 내 (2.7.15 및 3.6.8 모두) 시도 할 때 SyntaxError
Alice Purcell 19

웹 사이트에서 코드를 복사 / 붙여 넣기 할 때이 오류가 발생했습니다. 위치는 괜찮아 보였지만 QGIS (3.10)가 코드를 실행하기 전에 공백을 제거하고 공백을 사용하여 다시 적용해야했습니다.
benj

23

Python에서 간격은 매우 중요하며 이는 코드 블록의 구조를 제공합니다. 이 오류는 다음과 같이 코드 구조를 엉망으로 만들 때 발생합니다.

def test_function() :
   if 5 > 3 :
   print "hello"

파일에 탭과 공백이 혼합되어있을 수도 있습니다.

PyScripter 또는 Netbeans 와 같은 Python 구문 인식 편집기를 사용하는 것이 좋습니다.


1
예, 확실히 파이썬 인식 편집기를 사용하십시오! 나는 기본 설정으로 ++ 메모장에서 편집 된 문제가 있었다 그것은 공백의 잘못을 얻고 있었다
데이브 아처에게

2
혼합 된 탭과 공백은 "SyntaxError : 들여 쓰기에서 탭과 공백의 일관성없는 사용"을
일으 킵니다

참고로 Python Netbeans 플러그인은 현재 탭을 기존 코드의 공백으로 변환하지 않습니다. 그러나 새 코드를 작성할 때이를 수행합니다.
James McMahon

PyCharm은이를 일관되게 변환 할 수 있습니다. 또한 "fault"에있는 줄을 강조 표시합니다. 따옴표를 사용하는 이유는 이것이 1960 년대가 아니기 때문이며 Python과 같은 멋진 언어가 여전히 이처럼 두뇌가 죽고 시간을 낭비하는 결함이 있다는 것을 믿을 수 없습니다.
Echelon 2012

의도 치 않게 코드를 작성하는 도중에 편집기를 전환했고 새로운 코드에서 들여 쓰기가 채워졌습니다. 변경 사항은 눈에 분명하지 않았지만 인터프리터는 내 코드를 실행하지 않았습니다. 이 게시물은 문제를 찾는 데 도움이되었습니다.
Lucien Stals 2015

21

-tt 옵션을 사용하여 코드를 실행하여 탭과 공백을 일관성없이 사용하고 있는지 확인하십시오.


16

사용중인 편집기에서 보이는 공백을 켜고 탭을 공백으로 바꾸기를 켜십시오.

Python 믹싱 탭과 공백으로 탭을 사용할 수 있지만 일반적으로 오류가 발생합니다. 탭을 공백 4 개로 바꾸는 것이 Python 코드 작성에 권장되는 접근 방식입니다.


1
구체적으로 어떻게합니까? 저는 Sublime을 사용하고 있습니다.
chibole

8

올바른 들여 쓰기를 사용하여. Python은 공백을 인식하므로 블록에 대한 들여 쓰기 지침을 따라야합니다. 그렇지 않으면 들여 쓰기 오류가 발생합니다.


6

Sublime을 사용하여 Python을 작성하고 들여 쓰기 오류가 발생하면

보기-> 들여 쓰기-> 들여 쓰기를 공백으로 변환

내가 설명하는 문제는 Sublime 텍스트 편집기로 인해 발생합니다. 다른 편집자에서도 동일한 문제가 발생할 수 있습니다. 본질적으로이 문제는 공백으로 들여 쓰기를 처리하려는 Python과 탭으로 들여 쓰기를 코딩하는 다양한 편집기와 관련이 있습니다.


오 ... 숭고한 것이 원인입니까?
nitin

예, 제가 설명하는 문제는 Sublime에 의해 발생합니다. 다른 편집자에 의해서도 발생할 수 있습니다. 본질적으로이 문제는 공백으로 들여 쓰기를 처리하려는 Python과 탭으로 들여 쓰기를 코딩하는 다양한 편집기와 관련이 있습니다.
Puneet Lamba

메모장 ++에서 동일한 문제가 발생했습니다. 눈을 만난 것이 사실이므로 이것을 깨는 데 시간이 걸렸습니다. 편집기가 일부 공백을 탭으로 변환했는지 확인하기 위해 커서를 한 번에 한 문자 씩 이동해야했습니다
Bharat Anand

4

편집기에서 "탭 대신 공백 삽입"옵션을 사용하는지 확인하십시오. 그런 다음, 예를 들어 4의 탭 너비를 원하는 것을 선택할 수 있습니다. gedit의 edit-> preferences-> editor에서 옵션을 찾을 수 있습니다.

결론 : 탭이 아닌 공백 사용


귀하의 수익이 트릭을 수행했습니다!
Nick Div

3

이 오류는 Python 인터프리터 (터미널 / 콘솔)에 무언가를 붙여 넣을 때도 발생할 수 있습니다.

인터프리터는 빈 줄을 표현식의 끝으로 해석하므로 다음과 같이 붙여 넣으면

def my_function():
    x = 3

    y = 7

인터프리터는 이전의 빈 줄을 y = 7식의 끝으로 해석합니다 . 즉, 함수 정의가 끝났음을 의미하고 다음 줄 y = 7은 새식이 기 때문에 잘못된 들여 쓰기를 갖게됩니다.


키 존재는 함수 정의 내에서 빈 줄이 잘되어 있다고 하지만, 파이썬은 함수의 끝으로 어떤 빈 줄을 해석하기 때문에 그들은 여전히 초기 공백이 있어야합니다
MichaelChirico

3

언급되지 않은 것으로 보이는 한 가지 문제는 들여 쓰기와 관련이없는 코드 문제로 인해이 오류가 발생할 수 있다는 것입니다.

예를 들어, 다음 스크립트를 사용하십시오.

def add_one(x):
    try:
        return x + 1
add_one(5)

이것은 IndentationError: unexpected unindent문제가 물론 누락 된 except:문장 일 때를 반환합니다 .

내 요점 : 예상치 못한 (un) 들여 쓰기가보고 된 위의 코드를 확인하십시오!


2

들여 쓰기가 괜찮아 보이면 편집기에 "공백보기"옵션이 있는지 살펴보십시오. 이를 활성화하면 공백과 탭이 혼합 된 위치를 찾을 수 있습니다.


2

항상 나를 위해 일한 트릭이 있습니다.

예상치 못한 들여 쓰기가 있고 모든 코드가 완벽하게 들여 쓰기 된 것을 확인한 경우 다른 편집기로 열어 보면 들여 쓰기되지 않은 코드 줄을 볼 수 있습니다.

vim, gedit 또는 이와 같은 편집기를 사용할 때 나에게 일어났습니다.

코드에 편집기를 하나만 사용하십시오.


2

스크립트를 복사하여 "" "전체 코드" ""아래에 넣으십시오.

이 줄을 변수에 지정하십시오.

a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..

이제 ctrl + b를 사용하여 Sublime Editor에서이 코드를 실행하면 콘솔에 들여 쓰기 된 코드가 인쇄됩니다. 그게 다야


내 코드를 어떻게 실행합니까? "" "및" ""및 인쇄물을 제거해야합니까? a. 교체하고 정상적으로 실행해야합니까?
chibole

"" "" ""(세 개의 따옴표)는 문자열이 아닌 콘텐츠를 참조하지 않습니다. 그 코드가 싱글 / 더블 따옴표 그래서 "" "필요하지 않은 문자열이 포함되어있을 수 있기 때문에이 필요합니다.
모 히딘 빈 모하메드

2

다음 코드의 시작 부분에서 공백이나 탭 공백을 제거하기 만하면됩니다.

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

2

다음 명령을 실행하여 해결하십시오.

autopep8 -i <filename>.py

이렇게하면 코드가 업데이트되고 모든 들여 쓰기 오류가 해결됩니다. :)

이것이 해결되기를 바랍니다.


구현하기 매우 쉽습니다. 매번 나를 위해 일하기 때문에 누군가에게 도움이되기를 바랍니다. :)
Sharyar Vohra

1

메모장 ++은 탭 공간을 올바르게 제공했지만 마침내 Sublime 텍스트 편집기에서 들여 쓰기 문제가 발견되었습니다.

Sublime 텍스트 편집기를 사용하고 한 줄씩 이동


0

Python의 들여 쓰기 는 중요하며 다른 많은 프로그래밍 언어와 달리 코드 가독성을위한 것이 아닙니다. 연속 된 명령 사이에 코드에 공백이나 탭이 있으면 Python이 이에 민감하므로 Python은이 오류를 표시합니다. Python에 코드를 복사하여 붙여 넣을 때이 오류가 발생할 수 있습니다. Notepad ++와 같은 텍스트 편집기를 사용하여 이러한 공백을 식별하고 제거하거나 오류가 발생한 코드 줄에서 공백을 수동으로 제거하십시오.

Step1 :Gives error 
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])

Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])

Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]

감사!

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