您能否构建一个与以下内容匹配的最小有效源代码示例 Python 2.7 grammar rules ?是否可以不产生运行时错误?
(1) atom: '[' [listmaker] ']'
(2) listmaker: test list_for
(3) list_for: 'for' exprlist 'in' testlist_safe
(4) testlist_safe: old_test
(5) old_test: old_lambdef
(6) old_lambdef: 'lambda' [varargslist] ':' old_test
到目前为止我能达到的最好结果是:
L = [ fn() for fn in (lambda: x for x in xrange(3)) ]
但是我的解决方案的问题是“lambda”周围的括号。你能建立一个不带括号的例子吗?如果不是,那么你如何解释为什么你不能构建“in lambda”,即使它完全符合语法规则?
最佳答案
[x for x in lambda: 1]
这非常简单。当然,这会在运行时产生 TypeError,但语法的设计目的并不是排除会产生 TypeError 的结构。
没有办法在运行时不发生异常,因为 old_lambdef
始终计算为函数对象,而该函数对象是不可迭代的。在 old_lambdef
的结构中没有任何地方可以插入一些东西来让 Python 调用该函数; Python 将尝试迭代函数对象本身,而不是调用它并迭代返回值。
teSTList_safe
和 old_test
定义的完整形式为
testlist_safe: old_test [(',' old_test)+ [',']]
old_test: or_test | old_lambdef
teSTList_safe
并不总是单个 old_test
,并且 old_test
并不总是 old_lambdef
。允许 teSTList_safe
为 old_test
,并且允许 old_test
为 old_lambdef
。一起做这些事情总是会在运行时产生异常,但它们不会仅仅为了阻止人们一起做这些事情而使语法复杂化。
关于Python 2.7 语法极客 - 列表推导式中的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43903056/