在documentation中,生成器表达式的定义为
generator_expression ::= "(" expression comp_for ")"
而在grammar中,它被隐藏并读取
atom: ('(' [yield_expr|testlist_comp] ')' | .......
testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
根据语法,“(”“*”表达式comp_for“)”是一个有效的生成器表达式,但在文档中没有详细说明。有人能指出这种具有明星的发电机的具体例子。
假设myList = ((1, 2, 3), (4, 5, 6))
,请考虑例如(*x for x in myList)
myList
是一个原子 for x in myList
根据
comp_for:'for'explist'
*x
匹配star_expr
因此test|star_expr
*x for x in myList
匹配testlist_comp
(*x for x in myList)
是一个有效的原子,因为它匹配'(' testlist_comp ')'
python解释器给出 SyntaxError:迭代解包不能用于理解
答案 0 :(得分:1)
Python中的法律语法与语法所描述的完全不同。 ast.c中对ast_error
的各种调用是语法允许但无效的案例。 "位置参数跟随关键字参数"是最熟悉的语言之一:语法中没有什么不允许的
def foo(what=None, how):
pass
但这会引发SyntaxError(请参阅this line in ast.c in the cpython source)。