Unindent 不匹配任何外部缩进级别 (Python)

Unindent 不匹配任何外部缩进级别 (Python)

Unindent does not match any outer indentation level (Python)

当我们在同一代码块中混合使用制表符和空格时,会出现 Python“IndentationError: unindent does not match any outer indentation level”。

要解决该错误,请删除间距并仅使用制表符或空格,但不要将两者混合在同一代码块中。

indentationerror unindent 不匹配任何外部缩进级别

下面是错误如何发生的示例。

主程序
# ⛔️ IndentationError: unindent does not match any outer indentation level if len('hi') == 2: print('a') # 👈️ indented using tabs print('b') # 👈️ indented using spaces

代码块中的第一行使用制表符缩进,第二行使用空格缩进。

混合制表符和空格

屏幕截图显示该print('a')行使用制表符缩进,该
print('b')行使用空格缩进。

使用制表符标识代码块中的所有行

要解决该错误,请删除空格并仅使用制表符或空格缩进代码块中的行。

您的错误消息应显示出现错误的确切位置,以便您可以删除空格并使用制表符或空格一致地缩进代码块中的行。

indentationerror unindent 不匹配任何外部缩进级别

您应该只在整个代码块中使用制表符或只使用空格(取决于您的偏好)。

但是,您不能拥有同时使用制表符和空格缩进的代码块。

解决错误的最佳方法是删除前导空格并仅使用制表符缩进行。

主程序
# ✅ correctly indented code if len('hi') == 2: print('a') elif len('hello') == 5: print('b') else: print('c')

如果您从 Internet 复制代码并将其粘贴到您的 IDE 中,请删除缩进并仅使用制表符手动缩进行。

在您的 IDE 中将缩进转换为制表符

如果您使用 VSCode,您可以使用“将缩进转换为空格”或“将缩进转换为制表符”命令来解决错误:

  1. CTRL + Shift + P或(在 Mac 上为+ Shift+ P)打开命令面板。
  2. 类型:“将缩进转换为”
  3. 选择您的首选选项
  4. 保存文件

vscode 将缩进转换为

如果你使用 VSCode,你可以通过以下方式显示空白字符:

  1. CTRL + Shift + P或(在 Mac 上为+ Shift+ P)打开命令面板。
  2. 输入“打开工作区设置”
  3. 打字renderwhitespace
  4. 将其设置为all

vscode 渲染空白

如果您在 IDE 中呈现空白字符,制表符应显示为箭头,空格应显示为点。

混合制表符和空格

解决Sublime Text中的错误

如果您使用 Sublime Text,您可以通过以下方式将其设置为使用制表符进行缩进:

  • 单击查看->缩进->将缩进转换为制表符

如果选中了Indent using spaces复选框,您也可以取消选中它。

解决VIM中的错误

如果您使用 VIM,请点击Escapegg=G键入并按Enter

解决vim中的错误

请注意该行是如何自动正确缩进的。

解决IDLE代码编辑器中的错误

如果您使用 IDLE 代码编辑器:

  1. CTRL+A选择文件中的所有代码。
  2. 点击顶部菜单中的Format ,然后点击Untabify Region

解除区域3. 选择每个选项卡 8 列,然后单击确定

修复空闲时的缩进

单击“确定”按钮后,保存文件,然后就可以开始了。

确保不要混用制表符和空格

如果仅使用制表符或仅使用空格,这是个人喜好问题,但请确保不要将两者混用。

请注意,如果您在一个代码块中使用制表符而在另一个代码块中使用空格,则不会出现错误。

仅当您在同一代码块中混合使用制表符和空格时才会引发此错误。

仅使用制表符或空格

上面的if语句使用制表符进行缩进,下面的语句使用空格。

该示例不会导致错误,因为我们没有在同一代码块中混合使用制表符和空格。

使用 tabnanny 检测缩进错误

您可以使用tabnanny内置模块来检测在哪一行发生了缩进错误。

python -m tabnanny main.py # 👇️ for Python 3 python3 -m tabnanny main.py # 👇️ for Windows py -m tabnanny main.py

使用 tabnanny 检测缩进错误

确保main.py在命令中替换为实际文件的名称。

报错信息显示错误发生在第36行。

换句话说,我必须从第 36 行中删除前导空格并一致地缩进代码(仅使用空格或仅使用制表符)。

Python 使用缩进来确定哪个代码属于一个块

Python 使用代码的缩进级别来确定哪些代码属于一个块。

主程序
a_list = ['a', 'b', 'c'] for item in a_list: print(item) # 👈️ inside the block print('last') # 👈️ outside the block

for 循环print(item)中的调用缩进的,属于循环的块。for

最后一行的调用print没有缩进,不属于循环块for

Python 知道您是否打算在循环的每次迭代中运行 print
()for的唯一方法是基于缩进级别。

代码块中的所有行都必须使用制表符或空格缩进,但不能同时缩进。

您不应该使用制表符在代码块中缩进 1 行,而另一行使用空格缩进,因为这会导致错误。

代码块定义为以冒号结尾的行

当一行以冒号结尾时,下一行应该缩进以被视为该块的一部分。

主程序
if len('hi') == 2: print('a') elif len('hello') == 5: print('b') else: print('c')

if,elif和语句的行else以冒号结尾,因此要运行属于相应块的代码,我们必须使用制表符或空格将其缩进。

确保不要混用制表符和空格,例如,不要使用制表符来缩进块if
,也不要使用空格来缩进
elif块。

下面是一些使用制表符在以冒号结尾的语句后缩进代码块的示例。

主程序
if len('hi') == 2: print('a') elif len('hello') == 5: print('b') else: print('c') def get_num(): return 100 for item in ['a', 'b', 'c']: print(item)

所有代码块都使用制表符一致缩进,因此一切都按预期进行。

pep8 风格指南推荐使用空格

pep8风格指南
建议在制表符上使用空格进行缩进。

根据建议,应该在已经使用制表符缩进的代码库中使用制表符。

但是,他们建议为新项目使用空间。

如前所述,Python 不允许混用制表符和空格进行缩进。

使用制表符还是空格取决于个人喜好,但请确保不要将两者混合在同一代码库中,因为这通常会导致 Python 出现问题。