所有,今天我在python中遇到了一个奇怪的惊喜。以下代码有效,但似乎违反了python的语法。我不知道为什么没有传递语句或某些代码它会工作,但确实如此。
def test():
'''Sample docstring.'''
for i in range(10):
test()
print "testing", i
我想确定为什么会这样,以及它在运行时是否在内存中留下任何令人讨厌的位。这可能是我一直试图追查的内存问题的原因。
答案 0 :(得分:11)
块中必须至少有一个语句。单个字符串文字被认为是有效语句,即使它被用作docstring。它不应该导致任何内存泄漏,因为编译器在实际代码中省略了它。
答案 1 :(得分:2)
Python的语法在语言参考中进行了解释。相关部分是:
...
funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite
...
因此,函数的语法就是冒号,然后是suite
。
...
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
...
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
...
因此suite
可以是stmt_list
或包含至少一个statement
的缩进块...而stmt_list
只是一堆simple_stmt
在一行上用分号连接的块。
最后:
simple_stmt ::= expression_stmt
| assert_stmt
...
这表明simple_statement
可以是任何表达式,或assert
或列表中的其他内容。
您可以点击这些页面上的链接进一步探索。 expression_stmt
只是自己评估的任何表达式,如:
dir
2
"cat"
int()
这是一个完全有效的python程序,它将解析并运行,即使它什么都不做。
函数的docstring也是一个表达式。它只是一个恰好被系统处理的字符串。
但是,特殊处理不是语法的一部分。它发生在另一个阶段,很久在解析器构建了它的抽象语法树之后。
我会在别处寻找内存问题......:)
答案 2 :(得分:0)
docstring也是一个声明。 (准确的表达式声明。)
它得到了编译器的特殊处理,但从语法上讲它是一个非常有效的声明。