Python函数语法似乎无效,但可以运行
总之,我今天在python中遇到了一个奇怪的惊喜。下面的代码可以工作,但似乎违反了python的语法。我不知道为什么它在没有pass语句或一些代码的情况下可以工作,但它确实可以Python函数语法似乎无效,但可以运行,python,syntax,memory-leaks,Python,Syntax,Memory Leaks,总之,我今天在python中遇到了一个奇怪的惊喜。下面的代码可以工作,但似乎违反了python的语法。我不知道为什么它在没有pass语句或一些代码的情况下可以工作,但它确实可以 def test(): '''Sample docstring.''' for i in range(10): test() print "testing", i 我想确定为什么会这样,以及它在运行时是否会在内存中留下任何讨厌的部分。这可能是我一直试图查找的内存问题的原因。一个块中必须至少有一
def test():
'''Sample docstring.'''
for i in range(10):
test()
print "testing", i
我想确定为什么会这样,以及它在运行时是否会在内存中留下任何讨厌的部分。这可能是我一直试图查找的内存问题的原因。一个块中必须至少有一条语句。单个字符串文字被视为有效语句,即使它被用作docstring。但是它不应该导致任何内存泄漏,因为编译器在实际代码中省略了它。docstring也是一条语句。(确切地说,这是一个表达式语句。)
编译器对它进行了特殊处理,但在语法上它是一个完全有效的语句。Python的语法在语言参考中有解释。有关部分包括: 因此,函数的语法是冒号之前的所有内容,后面是
套件
因此,套件
可以是stmt\u列表
或包含至少一条语句的缩进块
。。。一个stmt\u列表
就是一行上用分号连接的一堆simple\u stmt
块
最后:
这表明simple_语句
可以是任何表达式,也可以是assert
或列表中的任何其他语句
您可以单击这些页面上的链接进行进一步探索。一个表达式\u stmt
就是任何一个自己计算的表达式,比如:
dir
2
"cat"
int()
这是一个非常有效的python程序,它将解析并运行,即使它什么都不做
函数的docstring也是一个表达式。它只是一个碰巧被系统特别处理的字符串
但是,特殊处理不是语法的一部分。它发生在另一个阶段,在解析器构建其抽象语法树之后很久
我会在别处寻找内存问题…:) 在
test()
的docstring下添加一个pass
,看看内存泄漏是否消失,不是很简单吗?这是一个简化的示例。实际的代码只显示了“真实世界”中的漏洞,而当我通过它时,我正在排除可能的漏洞。你已经回答了我的问题,谢谢!不是docstring是一个语句,而是string literal是一个语句;通过分配给。\uuuu doc\uuuuu
,可以在函数外部创建docstring,但如果其中没有语句,则无法编译。详细信息为+1,指向python参考的几个角落的链接为+1。
...
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
...
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
...
simple_stmt ::= expression_stmt
| assert_stmt
...
dir
2
"cat"
int()