2017-05-10 1 views
2

Python 2.7 grammar rulesにマッチする最小限の有効なソースコードの例を作成できますか?ランタイムエラーが発生することはありませんか?Python 2.7文法Geek - リスト内のラムダ補完

(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)) ] 

しかし、私の解決策の問題は、「ラムダ」を括弧で囲んであります。あなたはかっこなしの例を作ることができますか?もしそうでなければ、文法の規則に完全にマッチしたとしても、なぜラムダを構築できないのか説明してください。

+1

これを行う特別な理由は何ですか? – user2357112

+0

'old_test'と' old_lambdef'の定義は相互に再帰的です。私はそれが正しいとは思わない。 – jwodder

+0

@ user2357112確かに:(1)から(6)までの記述された文法規則をトリガーするpythonソースコードを探しています。 – sqrt163

答えて

5
[x for x in lambda: 1] 

これはかなり簡単です。もちろん、これは実行時にTypeErrorを生成しますが、文法はTypeErrorsを生成する構造体を除外するようには設計されていません。

old_lambdefは常に反復可能ではない関数オブジェクトに評価されるため、実行時に例外を発生させる方法はありません。 old_lambdefのどこにもPythonが関数を呼び出すための何かを挿入することができます。 Pythonはそれを呼び出して戻り値を反復するのではなく、関数オブジェクト自体を反復しようとします。 testlist_safeold_test定義の


完全形は

testlist_safe: old_test [(',' old_test)+ [',']] 
old_test: or_test | old_lambdef 

testlist_safeは常に単一old_testなく、old_testは常にold_lambdefありません。 testlist_safeold_testであることが許可されており、old_testold_lambdefであることが許可されています。これらのことを一緒に実行すると、実行時に例外が生成されますが、文法を複雑にして、人々がそれらのことを一緒にやることを止めさせることはありませんでした。

+0

実行時エラーのない例がありますか? – sqrt163

+0

@Ivan:いいえ。この構造体の式は、常にTypeErrorを生成します。おそらく「それはなぜ許可されているのか」と思っているかもしれませんが、実際の利益のためにそれを禁止するのはもっと多くの作業になります。 – user2357112

+1

@誰か読んでいる:問題の制作ルールは、これらの非終端記号の全定義ではなく、それらの制作物の完全な形式でもありません。また、これらは、これらの非終端記号の唯一の用途ではありません。これらの作品のいくつかは存在する理由がないように見えるかもしれませんが、それは完全な文脈がここに見えないからです。 – user2357112