1. ホーム
  2. python

[解決済み] Python3の「関数アノテーション」の上手な使い方とは?

2022-04-24 01:59:01

質問

関数のアノテーション。 PEP-3107

Python3の関数アノテーションを実演しているコードの断片に出会いました。 コンセプトはシンプルですが、なぜこれがPython3に実装されたのか、またその良い使い道が思いつきません。 おそらくSOは私を啓発することができますか?

どのように動作するのか

def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
    ... function body ...

引数の後のコロンに続くものはすべて「アノテーション」であり、引数の後の -> は、関数の戻り値に対するアノテーションです。

foo.func_annotationsは辞書を返すでしょう。

{'a': 'x',
 'b': 11,
 'c': list,
 'return': 9}

これを使えるようにする意義は何ですか?

どのように解決するのですか?

これ、実はすごいことだと思うんです。

学術的な背景から言うと、アノテーションは、Javaのような言語のスマートな静的解析器を可能にするために非常に貴重なものであることが証明されています。例えば、状態の制限、アクセスが許されるスレッド、アーキテクチャの制限などのセマンティクスを定義することができ、これらを読み込んで処理し、コンパイラーから得られる以上の保証を提供できるツールがかなりあります。前提条件や後条件をチェックするようなものも書けます。

Pythonは型付けが弱いので、このようなものが特に必要だと感じていますが、これを簡単に、かつ公式の構文の一部として使えるような構文がなかったんです。

アノテーションの使い道は、アシュアランス以外にもあります。私のJavaベースのツールをPythonに適用する方法がわかります。例えば、私はメソッドに特別な警告を割り当てることができるツールを持っていて、メソッドを呼び出すときに、そのドキュメントを読むべきだという表示をします(例えば、負の値で呼び出してはいけないメソッドがあるとしますが、それは名前から直感的にわかりません)。アノテーションを使えば、技術的にはPythonでこんなことが書ける。同様に、大きなクラス内のメソッドをタグに基づいて整理するツールも、公式な構文があれば書けるはずです。