Python:我在函数下的最后3个引号(""”)处遇到“缩进块”错误,怎么回事?

4 投票
2 回答
7613 浏览
提问于 2025-04-16 10:21

这真是太奇怪了,对吧?出问题的代码是:

def main():
"""
main function
"""
    # Argument handling

    args = sys.argv[1:]
    if not args:
        print "usage is: ...

第三个引号的地方我总是遇到缩进错误:

>>>Import someScript
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "someScript.py", line 24
    """
      ^

如果我删掉注释(当然我不想这样做),那么下一个定义的函数在它的注释位置也会出现同样的错误。如果我把所有函数的注释都删掉,错误就消失了。

我搞不懂!为什么那里会期待有缩进?我用Komodo Edit部分是因为它不允许你混用空格和制表符,但为了保险起见我还是搜索了一下,结果发现根本没有制表符。即使有,混用也没道理啊。

这是怎么回事,大神们?

2 个回答

2

正如所说,文档字符串没有缩进。如果能在字符串的第一行就报错,那会更好,但目前的分析器并不是这样工作的。它一次处理一个完整的标记——记住三重引号的字符串可以跨多行——然后如果缩进不对就会报错。这个符号就是整个三重引号的字符串,而它恰好在不同的行结束。对比一下:

>>> def f():
... """one line"""
  File "<stdin>", line 2
    """one line"""
                 ^
IndentationError: expected an indented block
>>> def f():
... foo()
  File "<stdin>", line 2
    foo()
      ^
IndentationError: expected an indented block
>>> def f():
... return 42
  File "<stdin>", line 2
    return 42
         ^
IndentationError: expected an indented block

注意在第二个例子中,它指向了“foo”的结尾,这是那个缩进错误语句中的第一个符号:这和指向你的文档字符串的结尾是一样的。

18

你需要把函数的文档字符串和函数的代码块一起缩进。

每个冒号 (:) 后面必须紧跟一个缩进的代码块。

撰写回答