2011-10-26 34 views
3

所有,我在Python今天运行了一个奇怪的惊喜。下面的代码有效,但似乎违反了python的语法。我不知道为什么它没有通过声明或一些代码,但它确实会起作用。Python函数的语法似乎是无效的,但运行

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

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

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

+3

是不是很简单的在'测试添加一个'pass'()'的文档字符串,看看内存泄漏消失? –

回答

11

块中必须至少有一条语句。独立的字符串文字被视为有效的语句,即使它被用作文档字符串。它不应该导致任何内存泄漏,因为编译器会在实际代码中忽略它。

+0

这是完全正确的。说得好。 –

+0

这是一个简单的例子。实际的代码只显示了“现实世界”中的泄漏,而当我经历它时,我正在探索可能性。你已经回答了我的问题,谢谢! –

0

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

它从编译器中得到特殊待遇,但在语法上它是完全有效的语句。

+1

这不是说docstring是一个语句,而是字符串文字是一个语句;可以通过赋给'.__ doc__'在函数之外创建一个docstring,但是如果它没有语句,那么它将无法编译。 –

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程序,将解析和运行,即使什么都不做。

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

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

我会寻求其他的内存问题... :)

+0

+1为详细信息,并链接到python文件的几个尘土飞扬的角落。 –