我有一个错误,上面写着“预计有一个缩进的块” 你能否指导我如何处理这个错误。谢谢:)
代码示例:
for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch)
答案 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
对。所以你必须小心缩进 - 同时混合标签和空格并不好。