Python函数语法似乎无效,但运行

时间:2011-10-26 01:18:33

标签: python syntax memory-leaks

所有,今天我在python中遇到了一个奇怪的惊喜。以下代码有效,但似乎违反了python的语法。我不知道为什么没有传递语句或某些代码它会工作,但确实如此。

def test():
    '''Sample docstring.'''

for i in range(10):
    test()
    print "testing", i

我想确定为什么会这样,以及它在运行时是否在内存中留下任何令人讨厌的位。这可能是我一直试图追查的内存问题的原因。

3 个答案:

答案 0 :(得分:11)

块中必须至少有一个语句。单个字符串文字被认为是有效语句,即使它被用作docstring。它不应该导致任何内存泄漏,因为编译器在实际代码中省略了它。

答案 1 :(得分:2)

Python的语法在语言参考中进行了解释。相关部分是:

7.7 Function definitions

...
funcdef        ::=  "def" funcname "(" [parameter_list] ")" ":" suite
...

因此,函数的语法就是冒号,然后是suite

7. Compound statements

...
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
...
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
...

因此suite可以是stmt_list或包含至少一个statement的缩进块...而stmt_list只是一堆simple_stmt在一行上用分号连接的块。

最后:

6. Simple statements

simple_stmt ::=  expression_stmt
             | assert_stmt
             ...

这表明simple_statement可以是任何表达式,或assert或列表中的其他内容。

您可以点击这些页面上的链接进一步探索。 expression_stmt只是自己评估的任何表达式,如:

dir
2
"cat"
int()

这是一个完全有效的python程序,它将解析并运行,即使它什么都不做。

函数的docstring也是一个表达式。它只是一个恰好被系统处理的字符串。

但是,特殊处理不是语法的一部分。它发生在另一个阶段,很久在解析器构建了它的抽象语法树之后。

我会在别处寻找内存问题......:)

答案 2 :(得分:0)

docstring也是一个声明。 (准确的表达式声明。)

它得到了编译器的特殊处理,但从语法上讲它是一个非常有效的声明。