Python中的缩进错误来自注释

8

Python如何处理注释中的缩进?

def foo():
    """
    Random comment
    """
    return True

可以正常工作,但是:

def foo():
"""
Random comment
"""
    return True

无法正常工作,抛出了一个 IndentationError 错误。

对我来说这很奇怪,因为注释不应该只是注释而已。另外,顺便说一下,这个可以正常工作:

def foo():
# Another random comment
    return True

你可能是指第二个代码片段确实会抛出一个IndentionError - user647772
2
@Tichodroma 实际上,OP 的意思是第二个代码片段无法工作,抛出了一个“缩进错误”。 - elssar
1
啊,在 Stack Overflow 这里说英语! - user647772
2个回答

14
三引号字符串不是注释,它是方法的文档字符串。您可以稍后使用foo.__doc__访问它,例如,或者使用help(foo)格式化它。三引号("""''')是指定字符串文字的Python特定方法,在其中不需要转义换行符。
因此,它是函数体的一部分,因此需要缩进以匹配。实际上,任何作为函数的第一个语句出现的字符串都被视为文档字符串,单引号也可以使用。对于类和模块也适用相同的技巧。
很多工具可以使用这个文档字符串;例如,你可以在这些信息中嵌入doctest tests。 有关格式化此字符串的约定,请参见PEP 257
另一方面,注释始终由#(如果不是字符串文字的一部分)表示,并且忽略到行尾。 如果整行只包含注释,则整行将被忽略,就像只有空格的行一样。 有关注释的说明,请参见documentation on comments

2
你应该注意在 Python 中,注释只能以 # 开头,不能有其他内容。 - Burhan Khalid
1
我认为你过分强调了文档字符串的重要性。缩进问题与文档字符串本身无关,只与字符串有关。 - BrenBarn
使用 pep 257,您需要阅读 pep8 中的注释部分 http://www.python.org/dev/peps/pep-0008/#comments。 - Dmitry Zagorulkin
1
@BrenBarn:关于文档字符串的教育在这里同样重要;承认第一个字符串文字不是注释是主要观点,因为OP显然知道语法。 - Martijn Pieters
@MartijnPieters:您的回答仅适用于字符串文字是块中的第一件事情,但从OP的措辞中看,他很可能认为所有三引号字符串都是注释,这就是为什么我认为它比只是文档字符串更广泛的原因。 - BrenBarn

3
不是注释,而是字符串字面值。它并没有被代码分配或使用,但它仍然是一个常规字符串,并且必须符合Python语法。(在这种情况下,它恰好是docstring,但这与缩进是否重要无关。)# 是获得注释的方法。

1
@Martijn Peters:我猜你指的是文档字符串?它在代码中没有被分配或使用。它碰巧是文档字符串,但这与缩进是否需要无关。我编辑了一下以澄清它是文档字符串。 - BrenBarn
1
未被分配或在此处的示例中使用,但它被分配了!你的说法充其量是令人困惑的。 - Martijn Pieters
@MartijnPieters 它被分配给了什么?并且引用BrenBarn的话,它是“由您的*[OP的]*代码分配给的”是什么? - anton.burger
3
@shambulator:解释器将其分配给函数、类或模块的.__doc__属性。不需要显式的赋值运算符,尽管foo.__doc__='你的新文档字符串'也可以正常工作。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接