Làm cách nào để khắc phục lỗi "thụt lề không mong muốn" trong python?
Làm cách nào để khắc phục lỗi "thụt lề không mong muốn" trong python?
Câu trả lời:
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.
except
phần của try
mệnh đề. Mã có vẻ đúng (trong đó dòng không có dấu hiệu có nghĩa là nằm ngoài try
khố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 )
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
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.
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.
Đả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
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 = 7
kế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 = 7
sẽ có thụt lề không chính xác vì nó là một biểu thức mới.
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 unindent
khi 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!
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.
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.
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ấ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)
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
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
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!