您能否构建一个与以下Python2.7语法规则相匹配的最小有效源代码示例?在不产生运行时错误的情况下有可能吗?
(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”,即使它完全符合语法规则?
发布于 2017-05-10 21:36:06
[x for x in lambda: 1]很简单。当然,这将在运行时生成一个TypeError,但是语法并不是为了排除将生成TypeErrors的构造。
没有办法在运行时无异常地这样做,因为old_lambdef总是计算为一个函数对象,它是不可迭代的。在old_lambdef的结构中,没有任何地方可以插入使Python调用函数的内容;Python将尝试迭代函数对象本身,而不是调用它并迭代返回值。
testlist_safe和old_test定义的完整形式如下
testlist_safe: old_test [(',' old_test)+ [',']]
old_test: or_test | old_lambdeftestlist_safe并不总是单一的old_test,old_test也不总是old_lambdef。testlist_safe允许是old_test,old_test允许是old_lambdef。在运行时,在一起做这些事情总是会产生异常,但是它们不会仅仅为了阻止人们在一起做那些事情而使语法复杂化。
https://stackoverflow.com/questions/43903056
复制相似问题