当我尝试运行Python脚本时,为什么会出现“预期的缩进块”?

时间:2010-02-13 14:59:16

标签: python indentation

我有一个错误,上面写着“预计有一个缩进的块” 你能否指导我如何处理这个错误。谢谢:)

代码示例:

for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch) 

6 个答案:

答案 0 :(得分:13)

您可能正在将标签与空格混合。 看起来缩进但实际上并非如此。


您的代码给了我一个不同的错误:

for ch in f:                                                  \
  ( translatedToken = english_hindi_dict[ch] )                \
    if (ch in english_hindi_dict) else (translatedToken = ch)
                                                        ↑

SyntaxError: invalid syntax

也许你的意思是:

for ch in f:
  if ch in english_hindi_dict:
    translatedToken = english_hindi_dict[ch]
  else:
    translatedToken = ch

也许你的意思是:

for ch in f:
  translatedToken = english_hindi_dict[ch] if ch in english_hindi_dict else ch

两者都应该运行得很好,我希望第二个比前者

更快

它们都可以优化为translated = str(english_hindi_dict.get(ch, ch) for ch in f),但这不是问题的重点。

答案 1 :(得分:13)

编辑答案以匹配代码示例。

for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch)  

只是无效的Python。

首先,可读性计数。您的代码难以阅读,因此难以调试。什么是“ch”和“f”?更重要的是,您可以在Python中使用一个内联,但不建议这样做,因此将for放在一个单独的行中。缩进。

for chunk in file: 
    ( translatedToken = english_hindi_dict[chunk] ) if (chunk in english_hindi_dict) else (translatedToken = chunk)

现在我们可以看到什么是错的。您在条件语句中进行变量赋值。这在Python中是不允许的。我猜你有一个C / C ++背景,并习惯这样做。在Python中你不能,以防止你编写混淆代码。所以你最终得到:

for chunk in file: 
    translatedToken = english_hindi_dict[chunk] if chunk in english_hindi_dict else chunk

如果您使用Python 2.5+,这段代码应该可以使用。但是三元运算符还没有旧的Python版本。让它更友好一点:

for chunk in file: 
    translatedToken = chunk
    if chunk in english_hindi_dict:
        translatedToken = english_hindi_dict[chunk]

你可能会说,写作时间更长,你说得对。但是你花费更多时间阅读代码而不是编写代码,因此让它易于阅读是有意义的。或者,一旦你掌握了Python,你将尝试以更加pythonic的方式工作。有没有听说过EAFTP?

for chunk in file: 
    try:
        translatedToken = english_hindi_dict[chunk]
    except KeyError:
        translatedToken = chunk

但是Python充满了惊喜,你会发现大多数这些经典用例已经被处理掉了。标准库通常提供优雅且简短且可读的解决方案:

for chunk in file: 
    translatedToken = english_hindi_dict.get(chunk, chunk)

作为结论:不要像编写Perl那样编写C或Java。其他工具,其他风格。


要解决此问题,请启动编辑器“搜索并替换”功能并制作一个巨大的“全部替换”以将所有标签更改为4个空格,或相反。然后缩进所有块,最后将所有指令对齐在同一个块中。

有趣的是之前没出现在SO上。毕竟,这是不正确的。

在Python中,您使用空格或制表符分隔块,而不是“{”。

因此,每当你进入一个块(一个函数,一个循环,一个类等)时,你必须缩进你的代码。这不仅仅是一种良好的做法,这是强制性的。如果你不这样做,你的程序就会崩溃。

现在,大多数情况下,您会收到此错误,因为您缩进了,但使用了制表符和空格。在Python程序中,您应该使用制表符或空格,但不能同时使用相同的文件。

E.G:

if (age > 18)
{
    printf("You can vote")
}

变为:

if age > 18:
    print("You can vote")

在大多数语言中,你可以这样做:

if (age > 18)
{
printf("You can vote")
}

在Python中你不能:

if age > 18:
print("You can vote")

引发了一个例外。更重要的是,你必须对齐同一个块的所有指令,所以:

if age > 18:
    print("You can vote")
    print("How cool is that ?")

很好,但是:

if age > 18:
    print("You can vote")
   print("How cool is that ?")

提出异常。

最终,您无法在同一块中混合制表符和空格。所以:

if age > 18:
    print("You can vote")
    print("How cool is that ?")

看起来不错,但会引发异常。要避免此问题,只需粘贴标签或空格即可。 PEP8是最常用作编码风格参考的文本,建议使用4个空格。

大多数编辑都有一个全局的“搜索和替换”功能,可让您解决任何问题。有些像Geany或Ulipad甚至有一个“用空格替换所有标签”功能。

答案 2 :(得分:11)

Python是一种非常依赖缩进来决定程序结构的语言,这与C和其他一些使用大括号的语言不同。

如果您有以下声明:

if true:
pass

它会抱怨,因为if没有缩进语句。您需要将其修复为:

if true:
    pass

这听起来像是你遇到的那种错误,但是如果发布实际代码可能会更加明显。在陈述问题时,最好给出代码并解释预期行为是什么以及与实际行为有何关联。你会让那些试图帮助你的人生活更轻松: - )

另请注意,即使您的代码看起来正确,您也可能会遇到此问题。在源代码中混合空格和制表符通常会导致这种情况。

答案 3 :(得分:3)

如果不同的话,

IndentationError可能会造成很多。在我的头顶:

  • 忘记缩进。

    Python使用缩进来分隔语法块。例如:

    if will_is_awesome:
        print "You're right"
    else:
        print "You lie!"
    

    如果忘记缩进,您将收到IndentationError: expected an indented block错误。例如:

    if will_is_awesome:
    print "You're right"
    else:
    print "You lie!"
    
  • 注释掉缩进的块。

    例如:

    if light_is_green:
        go_now()
    else:
        # go_anyway()
    do_something_else()
    

    这将产生IndentationError: expected an indented block,因为注释使else:之后的行看起来是空的解析器。添加pass语句将解决问题。例如:

    if light_is_green:
        go_now()
    else:
        # go_anyway()
        pass
    do_something_else()
    
  • 缩进的混合制表符和空格。

    不同机器和编辑器之间的制表位可能有所不同。如果你恰好混合标签和空格,你可以得到你的错误,但它通常会产生IndentationError: unindent does not match any outer indentation level,所以它不太可能是你的问题。无论如何,这是值得的。建议永远使用Python代码中的选项卡。

答案 4 :(得分:2)

Python使用缩进(代码行前面的空格/制表符)来指示代码块的开始和结束位置,相对于它前面的python语句。

所以,以PHP为例:

if ($blah == 'foo')
{
  // this is line 1 of my code block
  // this is line 2
}

在python下,是:

if blah == 'foo':
    # this is line 1 of my code block
    # this is line 2
    pass

您能否提供一些代码以及确切的错误?

答案 5 :(得分:1)

Python通过缩进来确定块,而不是通过字符{}(如C / C ++ / Java / PHP / ...)或if / endif或在其他一些语言中找到begin / end对。所以你必须小心缩进 - 同时混合标签和空格并不好。