Phải làm gì với "Thụt lề không mong muốn" trong python?


117

Làm cách nào để khắc phục lỗi "thụt lề không mong muốn" trong python?


4
Một đoạn mã tạo ra lỗi sẽ giúp chúng tôi hiểu rõ hơn vấn đề của bạn. Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm một số mã.
RBerteig

7
Điều này nghe có vẻ như một vấn đề về khoảng trắng đối với tôi vì vậy một mẫu mã sẽ vô dụng.
James McMahon

Câu hỏi mơ hồ và không có câu trả lời nào được chọn.
rafael.js 17/10/12

"Làm cách nào để khắc phục lỗi ..."? Bằng cách xác định nơi nó xảy ra và sửa chữa nguyên nhân gây ra lỗi. Trong trường hợp này, bằng cách làm cho thụt đầu dòng đó nhìn dòng cụ thể như những gì Python được mong đợi ...
twalberg

Câu trả lời:


132

Python sử dụng khoảng cách ở đầu dòng để xác định thời điểm các khối mã bắt đầu và kết thúc. Các lỗi bạn có thể mắc phải là:

Thụt lề không mong muốn. Dòng mã này có nhiều khoảng trắng ở đầu hơn dòng trước đó, nhưng dòng trước đó không phải là phần bắt đầu của một khối con (ví dụ: câu lệnh if / while / for). Tất cả các dòng mã trong một khối phải bắt đầu bằng cùng một chuỗi khoảng trắng. Ví dụ:

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

Điều này đặc biệt phổ biến khi chạy python tương tác: hãy đảm bảo rằng bạn không đặt thêm bất kỳ khoảng trắng nào trước các lệnh của mình. (Rất khó chịu khi sao chép và dán mã ví dụ!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent không khớp với bất kỳ mức thụt lề bên ngoài nào. Dòng mã này có ít khoảng trắng hơn ở đầu so với dòng trước đó, nhưng nó không khớp với bất kỳ khối nào khác mà nó có thể là một phần. Python không thể quyết định nó đi đâu. Ví dụ, trong phần sau, bản in cuối cùng có phải là một phần của mệnh đề if hay không?

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

Mong đợi một khối thụt lề. Dòng mã này có cùng số khoảng trắng ở đầu như dòng trước đó, nhưng dòng cuối cùng được mong đợi để bắt đầu một khối (ví dụ: lệnh if / while / for, định nghĩa hàm).

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

Nếu bạn muốn có một chức năng mà không làm bất cứ điều gì, sử dụng "no-op" lệnh qua :

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

Cho phép trộn các tab và khoảng trắng (ít nhất là trên phiên bản Python của tôi), nhưng Python giả định các tab dài 8 ký tự, điều này có thể không khớp với trình soạn thảo của bạn. Chỉ cần nói "không" với các tab. Hầu hết các trình chỉnh sửa cho phép chúng tự động được thay thế bằng dấu cách.

Cách tốt nhất để tránh những vấn đề này là luôn sử dụng số lượng khoảng trắng nhất quán khi bạn thụt lề một khối con và lý tưởng nhất là sử dụng một IDE tốt để giải quyết vấn đề cho bạn. Điều này cũng sẽ làm cho mã của bạn dễ đọc hơn.


7
lời giải thích hay. Bên cạnh đó, tôi cũng dành lỗi thụt lề Không mong muốn khi anh ta trộn dấu cách với 'tab' và 'thanh dấu cách' trong NotePad ++, thay thế 'tab' cho 'dấu cách' và sửa.
José Rosas Sáenz

2
@ JoséRosasSáenz Cảm nhận của bạn đã cứu tôi rất nhiều rắc rối
user3726345

Một nguyên nhân bổ sung là bỏ sót exceptphần của trymệnh đề. Mã có vẻ đúng (trong đó dòng không có dấu hiệu có nghĩa là nằm ngoài trykhối) nhưng Python báo cáo đây là lỗi 'thụt lề không mong muốn'. Điều này được khắc phục bằng cách thêm vào except, có lẽ bằng cách sử dụng pass(như ở đây )
dreadledad

@dumbledad Bạn thấy phiên bản python nào trên? Khi tôi thử trên của mình (cả 2.7.15 và 3.6.8), tôi nhận được Lỗi cú pháp
Alice Purcell

Tôi đã gặp lỗi này khi sao chép / dán mã từ một trang web. Định vị có vẻ ổn nhưng tôi cần xóa khoảng trắng và áp dụng lại bằng cách sử dụng khoảng trắng trước khi QGIS (3.10) chạy mã.
benj

23

Trong Python, khoảng cách là rất quan trọng, điều này cung cấp cấu trúc của các khối mã của bạn. Lỗi này xảy ra khi bạn làm sai cấu trúc mã của mình, ví dụ như sau:

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

Bạn cũng có thể có kết hợp các tab và khoảng trắng trong tệp của mình.

Tôi khuyên bạn nên sử dụng trình chỉnh sửa cú pháp python như PyScripter hoặc Netbeans


1
Có chắc chắn sử dụng trình chỉnh sửa nhận biết python! Tôi đã có một vấn đề mà tôi đã được chỉnh sửa trong notepad ++ với các thiết lập mặc định và nó đã nhận được sai khoảng trắng
Dave Archer

2
tab hỗn hợp và không gian nâng cao "Lỗi Cú pháp: sử dụng không phù hợp của các tab và khoảng trống trong thụt đầu dòng"
SilentGhost

Lưu ý, plugin Python Netbeans hiện không chuyển các tab thành khoảng trắng từ mã hiện có. Tuy nhiên, nó sẽ làm điều đó khi bạn viết mã mới.
James McMahon

PyCharm có thể chuyển đổi nó một cách nhất quán. Ngoài ra nó sẽ làm nổi bật các dòng bị "lỗi". Tôi sử dụng dấu ngoặc kép vì đây không phải là những năm 1960 và tôi không thể tin rằng một ngôn ngữ tuyệt vời như Python vẫn có lỗ hổng lãng phí thời gian và chết người này.
Echelon

Tôi đã vô tình chuyển đổi trình chỉnh sửa khi đang viết mã của mình và nó đã nhét đầy các thụt lề của tôi trong mã mới hơn. Sự thay đổi không rõ ràng bằng mắt thường, nhưng trình thông dịch sẽ không chạy mã của tôi. Bài đăng này đã giúp tôi tìm ra vấn đề.
Lucien Stals

21

Chạy mã của bạn với tùy chọn -tt để tìm hiểu xem bạn có đang sử dụng các tab và dấu cách không nhất quán hay không


16

Bật khoảng trắng hiển thị trong bất kỳ trình chỉnh sửa nào bạn đang sử dụng và bật tab thay thế bằng khoảng trắng.

Mặc dù bạn có thể sử dụng các tab với các tab trộn Python và không gian thường dẫn đến lỗi bạn đang gặp phải. Thay thế các tab bằng 4 dấu cách là cách tiếp cận được khuyến nghị để viết mã Python.


1
Làm thế nào để bạn làm điều này cụ thể? Tôi đang sử dụng Sublime.
chibole

8

Bằng cách sử dụng thụt lề chính xác. Python nhận biết được khoảng trắng, vì vậy bạn cần tuân theo hướng dẫn thụt lề của nó cho các khối, nếu không bạn sẽ gặp lỗi thụt lề.


6

Nếu bạn đang viết Python bằng Sublime và gặp lỗi thụt lề,

xem -> thụt lề -> chuyển đổi thụt lề thành dấu cách

Sự cố mà tôi đang mô tả là do trình chỉnh sửa văn bản Sublime gây ra. Vấn đề tương tự cũng có thể do các biên tập viên khác gây ra. Về cơ bản, vấn đề liên quan đến việc Python muốn xử lý các thụt đầu dòng về khoảng trắng so với các trình soạn thảo khác nhau mã hóa các thụt lề về mặt tab.


oh ... vậy là cao siêu gây ra điều này?
nitin

Có, vấn đề tôi đang mô tả là do Sublime gây ra. Cũng có thể do các biên tập viên khác gây ra. Về cơ bản, vấn đề liên quan đến việc Python muốn xử lý các thụt đầu dòng về khoảng trắng so với các trình soạn thảo khác nhau mã hóa các thụt lề về mặt tab.
Puneet Lamba

Tôi đã gặp vấn đề tương tự với notepad ++. Những gì vừa mắt là sự thật nên phải mất một thời gian để phá vỡ điều này. Tôi đã phải di chuyển con trỏ một char tại một thời gian để tìm ra các biên tập viên đã chuyển đổi một số khoảng trắng để các tab
Bharat Anand

4

Đảm bảo rằng bạn sử dụng tùy chọn "chèn dấu cách thay vì tab" trong trình chỉnh sửa của mình. Sau đó, bạn có thể chọn bạn muốn chiều rộng tab, ví dụ: 4. Bạn có thể tìm thấy các tùy chọn đó trong gedit dưới chỉnh sửa -> tùy chọn -> trình chỉnh sửa.

điểm mấu chốt: SỬ DỤNG KHÔNG GIAN không phải tab


Điểm mấu chốt của bạn đã thành công!
Nick Div

3

Lỗi này cũng có thể xảy ra khi dán nội dung nào đó vào trình thông dịch Python (terminal / console).

Lưu ý rằng trình thông dịch diễn giải một dòng trống là phần cuối của một biểu thức, vì vậy nếu bạn dán vào một thứ như

def my_function():
    x = 3

    y = 7

trình thông dịch sẽ diễn giải dòng trống trước khi y = 7kết thúc biểu thức, tức là bạn đã xác định xong hàm của mình và dòng tiếp theo - y = 7sẽ có thụt lề không chính xác vì nó là một biểu thức mới.


con người quan trọng mà các dòng trống trong định nghĩa hàm cũng tốt, nhưng họ vẫn phải có khoảng trắng đầu tiên kể từ khi Python giải thích bất kỳ dòng trống như cuối của hàm
MichaelChirico

3

Một vấn đề dường như chưa được đề cập đến là lỗi này có thể xuất hiện do sự cố với mã không liên quan đến thụt lề.

Ví dụ: lấy đoạn mã sau:

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

Điều này trả về IndentationError: unexpected unindentkhi vấn đề tất nhiên là một except:câu lệnh bị thiếu .

Quan điểm của tôi: hãy kiểm tra đoạn mã ở trên nơi báo cáo thụt lề (không) không mong muốn!


2

Nếu thụt lề trông ổn thì hãy xem trình chỉnh sửa của bạn có tùy chọn "Xem khoảng trắng" hay không. Việc kích hoạt điều này sẽ cho phép tìm thấy các khoảng trắng và tab được trộn lẫn.


2

Có một mẹo luôn hiệu quả với tôi:

Nếu bạn bị thụt lề bất ngờ và bạn thấy rằng tất cả mã được thụt lề hoàn hảo, hãy thử mở nó bằng một trình chỉnh sửa khác và bạn sẽ thấy dòng mã nào không được thụt lề.

Nó đã xảy ra với tôi khi sử dụng vim, gedit hoặc các trình biên tập như vậy.

Cố gắng chỉ sử dụng 1 trình soạn thảo cho mã của bạn.


2

Chỉ cần sao chép tập lệnh của bạn và đặt dưới "" "toàn bộ mã của bạn" "" ...

chỉ định dòng này trong một biến .. như,

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..

bây giờ thực thi mã này, trong Sublime Editor bằng ctrl + b, bây giờ nó sẽ in mã thụt lề trong bảng điều khiển. đó là nó


tôi sẽ chạy mã của mình như thế nào. Tôi sẽ phải xóa "" "và" "" và in a.replace và chạy nó bình thường chứ?
chibole

không có "" "" "" (dấu ngoặc kép) đề cập đến nội dung của bạn hơn là chuỗi. nó cần thiết bởi vì mã của bạn có thể chứa chuỗi đó là đơn / dấu ngoặc kép như vậy """ yêu cầu.
Mohideen bin Mohammed

2

Tất cả những gì bạn cần làm là xóa khoảng trắng hoặc dấu cách tab khỏi đầu các mã sau

from django.contrib import admin

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

2

Chạy lệnh sau để giải quyết nó:

autopep8 -i <filename>.py

Thao tác này sẽ cập nhật mã của bạn và giải quyết tất cả các lỗi thụt lề :)

Hy vọng điều này sẽ giải quyết


Rất dễ thực hiện. Làm việc cho tôi mọi lúc, đó là lý do tại sao tôi chia sẻ hy vọng sẽ có lợi cho ai đó :)
Sharyar Vohra

1

Notepad ++ đã cung cấp cho không gian tab chính xác nhưng vấn đề thụt lề cuối cùng đã được tìm thấy trong trình soạn thảo văn bản Sublime.

Sử dụng trình soạn thảo văn bản Sublime và đi từng dòng một


0

Thụt lề trong Python rất quan trọng và điều này không phải để dễ đọc mã, không giống như nhiều ngôn ngữ lập trình khác. Nếu có bất kỳ khoảng trắng hoặc tab nào trong mã của bạn giữa các lệnh liên tiếp, python sẽ đưa ra lỗi này vì Python nhạy cảm với điều này. Chúng tôi có thể gặp lỗi này khi chúng tôi sao chép và dán mã vào bất kỳ Python nào. Đảm bảo xác định và xóa những khoảng trắng này bằng trình soạn thảo văn bản như Notepad ++ hoặc xóa thủ công khoảng trắng khỏi dòng mã mà bạn gặp lỗi.

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]]

Cảm ơ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.