Python 2.7 语法极客-列表理解中的Lambda
Python 2.7 Grammar Geek - Lambda in List Comprehensions
您能否构建一个与以下 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,但语法并未设计为排除会产生 TypeErrors 的结构。
没有办法在运行时没有异常地做到这一点,因为 old_lambdef
总是计算为一个不可迭代的函数对象。在 old_lambdef
的结构中没有任何地方可以插入一些东西来使 Python 调用该函数; Python 将尝试迭代函数对象本身,而不是调用它并迭代 return 值。
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 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,但语法并未设计为排除会产生 TypeErrors 的结构。
没有办法在运行时没有异常地做到这一点,因为 old_lambdef
总是计算为一个不可迭代的函数对象。在 old_lambdef
的结构中没有任何地方可以插入一些东西来使 Python 调用该函数; Python 将尝试迭代函数对象本身,而不是调用它并迭代 return 值。
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
。一起做这些事情总是会在运行时产生异常,但它们不会为了阻止人们一起做这些事情而使语法复杂化。