Manjusaka

Manjusaka

随便聊聊 PEP570

最近、私は MIT 6.824 という分散システムの授業に夢中になっており、記事を書く気力がありませんでした。しかし、PEP570が受け入れられたと聞いたので、PEP 570 について何となく話してみることにしました。

Python の引数#

PEP570 について話す前に、まず Python の引数の変遷について見てみましょう。

Python 1.0 以前、Python の引数システムは現在私たちが主に使用している 2 つの形式、位置引数とキーワード引数をサポートしていました。いくつかの例を挙げます。


def abc(a, b, c):
    pass


abc(1, 2, 3)
abc(1, 2, c=3)
abc(1, b=2, c=3)
abc(*(1, 2, 3))
abc(**{"a": 1, "b": 2, "c": 3})

これは私たちがよく見る使い方ではありませんか?

長い間の発展の後、Python の引数システムを最適化し強化するいくつかの提案がありましたが、すべて拒否され続けていました。それは、PEP3102の登場までです。

3102 は、キーワード専用引数という概念を導入しました。例を示します。

次のような関数定義があるとします。

def abc(a, *, b, c):
    pass

この関数は次のような呼び出し方法のみをサポートします。

def abc(a, *, b, c):
    pass


abc(**{"a": 1, "b": 2, "c": 3})
abc(a=1, b=2, c=3)
abc(1, b=2, c=3)

OK、Argument の進化のプロセスについて話しましたので、次は 570 の提案について話しましょう。

ランダムに話す PEP 570#

570 は 3102 と似たようなことをしています。3102 はシンタックスシュガーを導入し、関数がキーワード専用の使用方法をサポートするようにしました。570 は関数が位置専用の使用方法をサポートするようにします。

次のような関数定義があるとします。

def abc(a, b, /, c):
    pass

570 により、この関数は次のような呼び出し方法のみをサポートします。

def abc(a, b, /, c):
    pass


abc(1, 2, c=3)
abc(1, 2, 3)

もしもこのようにしない場合、どうなるでしょうか?試してみましょう。現在、PEP570 には実装があります。bpo-36540: PEP 570 -- Implementationを参照してください。コンパイルしてテストしてみると、以下のような結果になります。

image

つぶやき#

実際、多くの人々は 570 の存在意義についてはっきりと考えていません。PEP 570 には多くの動機が挙げられています。しかし、私自身は、3102 と同様に、それは理念を実践していると考えています。

explicit is better than implicit

言い換えると、コードスタイルの一貫性をできるだけ保証するためには、ある程度の文法的なサポートが必要です。そして、570 と 3102 はこのような問題を解決するためのものです。

だから、私の視点から言えば、570 はかなり重要で意義のある提案だと思います(どちらも PEP57x ですが、なぜ待遇がこんなにも異なるのでしょうか?(笑

ちなみに、Python のコアメンバーの一人である Serhiy Storchaka は、この PEP が非常に好きで、PEP570 の実装がメインブランチにマージされる前に、いくつかの組み込みライブラリを改良していました。皆さんは PR を見に行ってみてください。[WIP] Use PEP 570 syntax for positional-only parameters

さて、今日の水文はここで終わりです... 私の記事は本当にますます水っぽくなっています...。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。