IndentationError: unindent không khớp với bất kỳ mức thụt ngoài nào


584

Khi tôi biên dịch mã Python bên dưới, tôi nhận được

IndentationError: unindent không khớp với bất kỳ mức thụt ngoài nào


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

Tại sao?


7
và có lẽ phạm vi (1, n + 1) sẽ tốt hơn, nếu bạn muốn đưa 'n' vào tính toán của mình :-)
Abgan

7
Tôi đã có cùng một lỗi, nhưng tôi tình cờ thụt một phương thức lên mã ở bên trái một chút, điều này đã đưa ra lỗi này ở dưới cùng của phương thức tiếp theo sau nó. Vì vậy, lỗi này có thể xảy ra không chỉ từ việc trộn các tab và khoảng trắng.
Hợp đồng của giáo sư Falken vi phạm

14
Tôi đang sử dụng Sublime Text 3. Tôi có một dự án Django. Tôi đã sửa lỗi bằng cách sử dụngView > Indentation > Intent Using Spaces
AbhimanyuAryan

Có vấn đề này trong pycharm, điều chỉnh các tab và khoảng cách trong cấu hình không hoạt động. Vấn đề là tôi đã có tệp ~ / .editorconfig ghi đè cấu hình pycharm.
Ken Myers

Tôi thấy việc sử dụng IDLE giúp tìm các vấn đề thụt đầu dòng dễ dàng hơn nhiều. Nó rõ ràng sẽ tìm thấy lỗi thụt lề mà hầu hết các biên tập viên không tìm thấy.
Dennis Gathagu

Câu trả lời:


668

Các áp phích khác có thể đúng ... có thể có khoảng trắng được trộn với các tab của bạn. Hãy thử thực hiện tìm kiếm & thay thế để thay thế tất cả các tab bằng một vài khoảng trắng.

Thử cái này:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)

2
vâng, tôi đã phải thực sự khoảng trống trên phần vòng lặp bên trong ở hai dòng cuối cùng (chỉ trong SO). Không chắc tại sao ...
cbrulak

3
dòng đầu tiên của tôi, "result = 0" (nên là 1, cảm ơn vì đã sửa) được đặt cách nhau trong khi phần còn lại được đánh dấu, darn, không biết python là như thế
cbrulak

1
Vâng, đó có thể là khó khăn. Tôi sử dụng emacs để chỉnh sửa python và tôi đã thiết lập nó để luôn thay thế các tab bằng khoảng trắng trong tệp py để tôi không gặp vấn đề này. Notepad ++ cũng có thể có một tùy chọn như thế này.
Kevin Tighe

3
Có cùng một vấn đề atm :). SublimeText hiển thị không gian dưới dạng dấu chấm, nó khá hữu ích.
Kris

Vì vậy, giữ cho bạn có thể thụt lề với các khoảng trống HOẶC tab. bạn chỉ cần được đồng ý? đầu bangs
David

265

QUAN TRỌNG : Không gian là phương pháp ưa thích - xem PEP008 lõmTabs hoặc Spaces? . (Cảm ơn @Siha vì điều này.)

Dành cho Sublime Textngười dùng:

Đặt Sublime Textđể sử dụng các tab để thụt lề: View-> Indentation->Convert Indentation to Tabs

Bỏ chọn Indent Using Spacestùy chọn trong cùng một menu phụ ở trên. Điều này sẽ ngay lập tức giải quyết vấn đề này.


1
Ngoài ra bất cứ khi nào sử dụng Python, hãy chắc chắn rằng bạn thiết lập một tùy chọn tương tự ở bất cứ IDE / Text Editor bạn sử dụng
activatedgeek

20
Ngoài ra trên ATOM, Gói> Khoảng trắng> Chuyển đổi không gian sang tab và bạn sẽ tránh được Nhức đầu Lỗi Cú pháp của Python!
loretoparisi 11/03/2015

1
Spaces là phương pháp ưa thích - xem PEP008 IndentationTab hoặc Spaces? . Sublime cũng có thể được thiết lập để làm theo cách này.
SiHa

13
bạn nói không gian là phương pháp ưa thích nhưng câu trả lời của bạn yêu cầu mọi người hỏi cao siêu để sử dụng các tab thay thế! Tôi bối rối
gota

@NunoCalaim Thật không may, điều đó đã xảy ra sau khi tôi trả lời câu hỏi. Nếu bạn đang bắt đầu một dự án mới, vui lòng sử dụng kỹ thuật không gian ưa thích. Đó là lý do tại sao tôi thực hiện một chỉnh sửa in đậm để bất kỳ người mới nào biết về sự từ chối.
kích hoạt

137

Để dễ dàng kiểm tra các sự cố với tab / dấu cách, bạn thực sự có thể làm điều này:

python -m tabnanny yourfile.py

hoặc bạn chỉ có thể thiết lập trình soạn thảo của mình một cách chính xác :-)


1
Tôi đã thử điều này trong một tệp có một số lỗi thụt lề / không gian, nhưng không có đầu ra nào với tệp tab không chính xác. bất kỳ ý tưởng?
Luchux

1
Tôi gặp vấn đề với khoảng trắng và lỗi cho biết đó là ở dòng 191, nhưng nhờ có tabnanny tôi thấy vấn đề thực sự không nằm ở dòng đó, mà là ở dòng trên.
richar8086

Cảm ơn bạn! Thật là một mẹo tuyệt vời. Lỗi được xác định bởi flake8 trong Mã VS nhưng nó không thể xác định được sự cố xảy ra ở đâu - tabnanny đã làm trong một phần triệu giây.
Steve

39

Bạn có chắc chắn rằng bạn không trộn các tab và khoảng trắng trong khoảng trắng thụt đầu dòng của bạn? (Điều đó sẽ gây ra lỗi đó.)

Lưu ý, bạn không nên sử dụng các tab trong mã Python. Xem hướng dẫn phong cách . Bạn nên cấu hình Notepad ++ để chèn khoảng trắng cho các tab.


Tôi bối rối. Câu trả lời ở trên để chuyển đổi tùy chọn soạn thảo văn bản để sử dụng các tab thay vì dấu cách.
spurra

3
@BananaCode Miễn là bạn sử dụng các tab CHỈ hoặc CHỈ khoảng trắng, về mặt kỹ thuật không thành vấn đề bạn chọn. Mặc dù đối với python, không gian được ưa thích, hãy xem liên kết mà tôi đã đề cập.
zdan

21

Bất cứ khi nào tôi gặp phải lỗi này, đó là do tôi đã trộn lẫn các tab và khoảng trắng trong trình chỉnh sửa của mình.


13

Nếu bạn sử dụng trình soạn thảo IDLE của Python, bạn có thể làm như nó gợi ý trong một trong các thông báo lỗi tương tự:

1) chọn tất cả, ví dụ Ctrl+A

2) Chuyển đến Định dạng -> Vùng không xác định

3) Kiểm tra kỹ việc thụt lề của bạn vẫn đúng, lưu và chạy lại chương trình của bạn.

Tôi đang sử dụng Python 2.5.4


9

Nếu bạn đang sử dụng Vim, nhấn thoát rồi gõ

gg = G

Tự động này thụt lề mọi thứ và sẽ dọn sạch mọi khoảng trống bạn đã ném vào.


8

Dòng: result = result * inên được thụt lề (nó là phần thân của vòng lặp for).

Hoặc - bạn có các ký tự không gian và tab hỗn hợp


Tôi đã phải thay đổi chỉnh sửa trong SO, lạ. Xem ghi chú "Chỉnh sửa" được cập nhật của tôi trong câu hỏi
cbrulak

Ok, vì vậy tôi tin rằng dòng thứ hai trong câu trả lời của tôi là chính xác - bạn có các ký tự không gian và tab hỗn hợp (tương ứng 32 và 8 trong ASCII)
Abgan

5

Trên nguyên tử

đi đến

Packages > Whitespace > Convert Spaces to Tabs

Sau đó kiểm tra lại thụt lề tệp của bạn:

python -m tabnanny yourFile.py

hoặc là

>python
>>> help("yourFile.py")

4

Có vẻ là một vấn đề thụt lề. Bạn không cần phải khớp dấu ngoặc nhọn trong Python nhưng bạn làm phải phù hợp với mức độ thụt đầu dòng.

Cách tốt nhất để ngăn chặn các vấn đề về không gian / tab là hiển thị các ký tự vô hình trong trình soạn thảo văn bản của bạn. Điều này sẽ cung cấp cho bạn một cách nhanh chóng để ngăn chặn và / hoặc giải quyết các lỗi liên quan đến thụt lề.

Ngoài ra, tiêm mã dán sao chép là một nguồn phổ biến cho loại vấn đề này.


4

Nếu bạn sử dụng notepad ++, hãy thực hiện "thay thế" bằng chế độ tìm kiếm mở rộng để tìm \ t và thay thế bằng bốn khoảng trắng.


2

đối với người dùng nguyên tử, Packages ->whitspace -> remove trailing whitespaces điều này hiệu quả với tôi


2

Chỉ là một bổ sung. Tôi gặp vấn đề tương tự với cả hai vết lõm trong Notepad ++.

  1. Vết lõm không được chấp nhận
  2. Cấp độ thụt ngoài

    Chuyển đến ----> tab Tìm kiếm ----> nhấn vào thay thế ----> nhấn nút radio Mở rộng bên dưới ---> Bây giờ thay thế \ t bằng bốn khoảng trắng

    Chuyển đến ----> tab Tìm kiếm ----> nhấn vào thay thế ----> nhấn nút radio Mở rộng bên dưới ---> Bây giờ thay thế \ n không có gì


2

Tôi đã sử dụng máy tính xách tay Jupyter và đã thử hầu hết tất cả các giải pháp trên (thích ứng với kịch bản của tôi) để không sử dụng. Sau đó tôi đã đi từng dòng một, xóa tất cả các khoảng trắng cho mỗi dòng và thay thế bằng tab. Điều đó đã giải quyết vấn đề.


2

Đối với người dùng Spyder, goto Nguồn> Khắc phục sự cố để khắc phục sự cố ngay lập tức


1

Có thể là do hàm trên không được thụt vào cùng một cách. I E

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")

1

Tôi đã có cùng một vấn đề ngày hôm qua, đó là lỗi thụt lề, đang sử dụng trình soạn thảo văn bản cao siêu. mất hàng giờ để cố gắng sửa nó và cuối cùng tôi đã sao chép mã vào trình soạn thảo văn bản VI và nó chỉ hoạt động tốt. ps python quá nhạy cảm với khoảng trắng, đảm bảo không trộn lẫn không gian và tab.


1

Vì tôi nhận ra không có câu trả lời cụ thể nào spyder, tôi sẽ thêm một câu: Về cơ bản, hãy cẩn thận xem iftuyên bố của bạn và đảm bảo tất cả if, elifelsecó cùng khoảng cách là chúng nằm trong cùng một dòng khi bắt đầu như vậy:

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")

1

Tôi đã có một chức năng được xác định, nhưng nó không có bất kỳ nội dung nào ngoài các nhận xét chức năng của nó ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

Nó hét lên:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(lưu ý rằng dòng ^đánh dấu trỏ đến trống)

-

Nhiều giải pháp:

1: Chỉ cần nhận xét chức năng

2: Thêm nhận xét chức năng

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3: Thêm dòng không có gì

def foo(bar):
    0

Trong mọi trường hợp, hãy đảm bảo làm rõ lý do tại sao nó là một hàm trống - cho chính bạn hoặc cho các đồng nghiệp sẽ sử dụng mã của bạn


Các tuyên bố qua có thể là hữu ích ở đó :)
KevinG

1

Đầu tiên, chỉ để nhắc nhở bạn rằng có một lỗi logic, tốt nhất bạn nên giữ kết quả = 1 nếu không thì kết quả đầu ra của bạn sẽ là result = 0 ngay cả sau khi vòng lặp chạy.

Thứ hai, bạn có thể viết nó như thế này:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

Rời khỏi một dòng sẽ cho vỏ python biết rằng các câu lệnh FOR đã kết thúc. Nếu bạn có kinh nghiệm sử dụng shell python thì bạn có thể hiểu tại sao chúng ta phải để lại một dòng.


1

Với giá trị của nó, chuỗi doc của tôi bị thụt quá nhiều và điều này cũng gây ra lỗi tương tự

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level


điều này đã khắc phục vấn đề của tôi
bhordupur

0

Điều này là do có sự pha trộn của cả tab và dấu cách. Bạn có thể xóa tất cả các khoảng trắng và thay thế chúng bằng các tab.

Hoặc, hãy thử viết điều này:

#!/usr/bin/python -tt

ở đầu mã. Dòng này giải quyết bất kỳ sự khác biệt giữa các tab và không gian.


0

trong trường hợp của tôi, vấn đề là cấu hình của pydev trên Eclipse

pydev @ Nhật thực


0

Nếu bạn sử dụng trình chỉnh sửa Komodo, bạn có thể thực hiện như một trong các thông báo lỗi tương tự:

1) chọn tất cả, ví dụ Ctrl + A

2) Chuyển đến Mã -> Vùng không xác định

3) Kiểm tra kỹ việc thụt lề của bạn vẫn đúng, lưu và chạy lại chương trình của bạn.

Tôi đang sử dụng Python 3.4.2


0

Nếu bạn đang sử dụng văn bản Sublime để phát triển python, bạn có thể tránh lỗi bằng cách sử dụng gói Anaconda. Sau khi cài đặt Anaconda,

  1. mở tập tin của bạn một cách tuyệt vời
  2. nhấp chuột phải vào không gian mở
  3. chọn anaconda
  4. nhấp vào tự động định dạng
  5. XONG hoặc nhấn CTRL + ALT + R.

0

Trong intellij với plugin python, Ctrl + Shift + Alt để định dạng lại tài liệu đã khắc phục sự cố thụt lề / tab / dấu cách


0

Đối với người dùng SPYDER : Tôi đang sử dụng spyder 3.3.2 với python 3.7.1 và tôi đã giải quyết vấn đề này, đặt thụt lề để sử dụng các tab, với các bước sau, nhấp vào:

  • Công cụ.
  • Sở thích.
  • Biên tập viên.
  • Cài đặt nâng cao.
  • Ký tự thụt -> Tab.

Sau đó, tôi đặt lại dòng "không xác định" bằng phím tab.

Vì một số lý do, không có cài đặt này, đôi khi tôi nhận được con ma IndentationError.


0

Ví dụ:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

Trong mã này tình huống tương tự xảy ra với tôi. Chỉ cần xóa các không gian thụt lề trước đó của dòng 2 và 3, sau đó sử dụng tab hoặc khoảng trắng . Không bao giờ sử dụng cả hai . Đưa ra thụt lề thích hợp trong khi viết mã bằng python. Đối với Nguồn goto Spyder> Sửa lỗi thụt lề. Tương tự với Mã VC và văn bản cao siêu hoặc bất kỳ trình soạn thảo nào khác. Sửa vết lõm.


-6

Điều này xảy ra chủ yếu là do trình soạn thảo. Hãy thử thay đổi tab thành khoảng trắng (4). IDE hay Trình chỉnh sửa thân thiện với python tốt nhất là pycharm, sublime, vim cho linux.
ngay cả tôi cũng đã gặp phải vấn đề tương tự, sau đó tôi thấy rằng có một vấn đề mã hóa. Tôi đề nghị bạn quá thay đổi trình soạn thảo của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.