And*_*reo 6 python grammar with-statement
在完整的python语法规范 with声明中定义为:
with_stmt: 'with' with_item (',' with_item)* ':' suite
with_item: test ['as' expr]
Run Code Online (Sandbox Code Playgroud)
在哪里expr:
expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
Run Code Online (Sandbox Code Playgroud)
为什么with_item包含expr规则而不是普通name?
这是有效的python代码:
with open('/dev/null') as f:
pass
Run Code Online (Sandbox Code Playgroud)
根据语法,这段代码也有效吗?
with open('/dev/null') as x^y|z:
pass
Run Code Online (Sandbox Code Playgroud)
with open('/dev/null') as x^y|z:
pass
Run Code Online (Sandbox Code Playgroud)
是的,这段代码根据语法有效!否则你会得到一个解析错误("语法无效").使用这种语法,解析器本身很好,它是编译器的另一部分,它检查左侧是否允许这样的表达式(因为as在语义上等同于赋值).语法允许expr在这里的原因,而不仅仅是NAME你可以在以下后面有任何左值as:
with open('/dev/null') as some.thing
with open('/dev/null') as some[thing]
Run Code Online (Sandbox Code Playgroud)
但是对于testlist左值没有单独的规则,例如左侧的分配使用,甚至更宽expr.