最近、私は MIT 6.824 という分散システムの授業に夢中になっており、記事を書く気力がありません。しかし、PEP570が受け入れられたと聞いたので、PEP 570 について何気なく話すことにしました。
Python の引数#
PEP570 について話す前に、まず Python の引数の変遷を見てみましょう。
Python の引数システムは、Python 1.0 以前から私たちが主に使用している 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を参照してください。コンパイルテストの結果は以下の通りです。
つぶやき#
実際、多くの人々は 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。
さて、今日の水文はここで終わりです... 私の記事は本当にますます水っぽくなっています...。