簡體   English   中英

我應該如何處理 Python 中的“意外縮進”?

[英]What should I do with "Unexpected indent" in Python?

如何糾正 Python 中的“意外縮進”錯誤?

Python 使用行首的間距來確定代碼塊的開始和結束時間。 您可能會遇到的錯誤是:

意外縮進。 這行代碼在開頭的空格比前面的多,但前面的不是子塊的開頭(例如ifwhilefor語句)。 塊中的所有代碼行必須以完全相同的空白字符串開頭。 例如:

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

這在以交互方式運行 Python 時尤其常見:確保在命令之前不要放置任何額外的空格。 (復制粘貼示例代碼時非常煩人!)

>>>   print "hello"
IndentationError: unexpected indent

Unndent 不匹配任何外部縮進級別。 這行代碼開頭的空格比前一行少,但同樣它不匹配它可能屬於的任何其他塊。 Python 無法決定它的去向。 例如,在下面,最終的打印是否應該是 if 子句的一部分?

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

需要一個縮進的塊。 這行代碼在開頭的空格數與前一行相同,但最后一行應該開始一個塊(例如, ifwhilefor語句或函數定義)。

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

如果您想要一個不執行任何操作的函數,請使用“no-op”命令pass

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

允許混合制表符和空格(至少在我的 Python 版本中),但 Python 假定制表符長度為 8 個字符,這可能與您的編輯器不匹配。 只需對標簽說“不”。 大多數編輯器允許它們自動替換為空格。

避免這些問題的最佳方法是在縮進子塊時始終使用一致數量的空格,並且最好使用能夠為您解決問題的良好 IDE。 這也將使您的代碼更具可讀性。

在 Python 中,間距非常重要。 這給出了代碼塊的結構。

當您弄亂代碼結構時會發生此錯誤,例如:

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

您的文件中可能還會混合使用制表符和空格。

我建議您使用 Python 語法感知編輯器,例如PyScripterNetBeans

使用-tt選項運行您的代碼,以了解您是否在不一致地使用制表符和空格。

在您使用的任何編輯器中打開可見空白並打開replace tabs with spaces

雖然您可以在 Python 中使用制表符,但混合制表符和空格通常會導致您遇到錯誤。 用四個空格替換制表符是編寫 Python 代碼的推薦方法。

通過使用正確的縮進。 Python 可以識別空格,因此您需要遵循其塊的縮進指南,否則會出現縮進錯誤。

運行以下命令來解決它:

autopep8 -i <filename>.py

這將更新您的代碼並解決所有縮進錯誤:)

如果你正在使用Sublime Text編寫 Python 並且遇到縮進錯誤,

菜單視圖縮進將縮進轉換為空格

我描述的問題是由 Sublime Text 編輯器引起的。 同樣的問題也可能是由其他編輯引起的。 從本質上講,這個問題與 Python 希望根據空格處理縮進與各種編輯器根據制表符對縮進進行編碼有關。

確保在編輯器中使用“插入空格而不是制表符”選項 然后您可以選擇您想要的選項卡寬度,例如 4。您可以在gedit中的菜單EditpreferencesEditor下找到這些選項。

底線:使用空格,而不是制表符

似乎沒有提到的一個問題是,由於與縮進無關的代碼問題,可能會出現此錯誤。

例如,采用以下腳本:

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

當問題當然是缺少except:語句時,這將返回IndentationError: unexpected unindent

我的觀點:檢查上面報告意外(未)縮進的代碼!

將某些內容粘貼到 Python 解釋器(終端/控制台)時也會發生此錯誤。

請注意,解釋器將空行解釋為表達式的結尾,因此如果您粘貼類似

def my_function():
    x = 3

    y = 7

解釋器會將y = 7之前的空行解釋為表達式的結尾,即您已經完成了函數的定義,並且下一行 - y = 7將有不正確的縮進,因為它是一個新表達式。

如果縮進看起來沒問題,那么看看你的編輯器是否有“查看空白”選項。 啟用此功能應該可以找到空格和制表符混合的位置。

有一個技巧一直對我有用:

如果你有一個意外的縮進並且你看到所有的代碼都被完美地縮進了,試着用另一個編輯器打開它,你會看到哪一行代碼沒有縮進。

當我使用Vimgedit或類似的編輯器時,它發生在我身上。

嘗試僅對您的代碼使用一種編輯器。

只需復制您的腳本,並將其放在 """ 您的整個代碼 """ ...

在變量中指定這一行......比如,

a = """ your Python script """

print a.replace("Here please press the tab button. It will insert some space", " here simply press the space bar four times.")
#
# Here we are replacing tab space by four character
# space as per the PEP 8 style guide...
#
# Now execute this code. In the Sublime Text
# editor use Ctrl + B. Now it will print
# indented code in the console. That's it.

您需要做的就是從以下代碼的開頭刪除空格或制表符空格:

from django.contrib import admin

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

這取決於上下文。 另一個尚未涵蓋的場景如下。 假設您有一個文件,其中包含一個包含特定方法的類

class Scraper:
    def __init__(self):
        pass

    def scrape_html(self, html: str):
        pass

在文件的底部你有類似的東西

if __name__ == "__main__":
    # some
    # commands
    # doing
    # stuff

使整個文件看起來像這樣

class Scraper:
    def __init__(self):
        pass

    def scrape_html(self, html: str):
        pass

if __name__ == "__main__":
    # some
    # commands
    # doing
    # stuff

例如,如果在 scrape_html() 中打開 if/else 語句

class Scraper:
    def __init__(self):
        pass

    def scrape_html(self, html: str):
        if condition:
            pass
        else:

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

您需要在 else 語句中添加pass或任何您想要的內容,否則您將得到

預期的縮進塊

在此處輸入圖像描述

未預期不縮進

在此處輸入圖像描述

預期表達

在此處輸入圖像描述

並且在第一行

意外縮進

在此處輸入圖像描述

添加該pass將解決所有這四個問題。

Notepad++給出了正確的制表符空間,但最終在Sublime Text編輯器中發現了縮進問題。

使用 Sublime Text 編輯器並逐行進行。

Python 中的縮進很重要,與許多其他編程語言不同,這並不是為了代碼的可讀性。

如果連續命令之間的代碼中有任何空格或制表符,Python 將給出此錯誤,因為 Python 對此很敏感。 當我們將代碼復制並粘貼到任何 Python 時,我們可能會收到此錯誤。

確保使用Notepad++等文本編輯器識別並刪除這些空格,或者從出現錯誤的代碼行中手動刪除空格。

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

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

# Step 3: 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]]

這取決於上下文,但縮進錯誤通常是由使用制表符而不是空格引起的。

您可以采取以下步驟來糾正此問題:

  1. 復制導致錯誤的制表符或空格

  2. 在您的 IDE 中進行查找和替換(通常是Ctrl + H )。

  3. 將復制的制表符或空格粘貼到“查找”搜索欄中,然后將它們全部替換為四個空格(假設您的 IDE 使用四個空格作為“好的”縮進)

如果您將代碼從外部源復制並粘貼到 IDE 中,也會經常發生此錯誤,因為其他地方的格式可能與您的 IDE 定義的“良好”縮進不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM