您能否构建一个与以下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”,即使它完全符合语法规则?你知道吗
这很简单。当然,这会在运行时产生一个TypeError,但是语法并不是为了排除会产生TypeError的构造而设计的。你知道吗
因为
old_lambdef
总是计算为函数对象,这是不可iterable的,所以在运行时没有异常是不可能做到的。在old_lambdef
的结构中,没有任何地方可以插入一些东西使Python调用函数;Python将尝试迭代函数对象本身,而不是调用它并迭代返回值。你知道吗testlist_safe
和old_test
定义的完整形式如下testlist_safe
并不总是一个old_test
,old_test
也不总是一个old_lambdef
。允许testlist_safe
成为old_test
,允许old_test
成为old_lambdef
。一起做这些事情总是在运行时产生异常,但它们不会仅仅为了阻止人们一起做这些事情而使语法复杂化。你知道吗相关问题 更多 >
编程相关推荐