Pythonを闇改造して辞書リテラルのキー名や関数呼び出しの引数名を省略できるようにしてみた

先日、Pythonを闇改造した でPythonにちょっとした改造を加えてみました。

この修正は、

def register_user(first, last, addr1, addr2):
    d = {'first': first,
         'last': last,
         'addr1': addr1,
         'addr2': addr2,
         'tel': '123-456-789'}

    requests.post(URL, d)

のようなコードを、JavaScriptの

d = {first, last, addr1, addr2, tel:'123-456-789'}

のように、

d = ${first, last, addr1, addr2, tel:'123-456-789'}

と書けるようにする、というパッチでした。

その後、この書き方、わざわざ ${} なんてしなくとも、

d = {:first, :last, :addr1, :addr2, tel:'123-456-789'}

で良いよね?ということに気がついて、これもパッチ を作ってみました。

https://github.com/atsuoishimoto/cpython/pull/4

これなら、辞書リテラルだけではなく、関数呼び出しにも使えます。例えば、

f(first=first, last=last, addr1=addr1, addr2=addr2)

は、この記法を使うと

f(:first, :last, :addr1, :addr2)

と書けます。

このパッチだと修正もかんたんで、Grammer/python.gram ファイルに、辞書リテラルと関数呼び出しで :変数名 を使えるように定義を追加し、辞書リテラルに変数名から要素を追加する処理を追加するだけで済みました。

ソースを修正したら、Pythonのソースディレクトリで

make regen-pegen

を実行してParserのソースコードを再生成します。あとは普通に

make

で完成です。あっけないぐらいに動いてしまいました。