[解決済み] Python3の「関数アノテーション」の上手な使い方とは?
質問
関数のアノテーション。 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でこんなことが書ける。同様に、大きなクラス内のメソッドをタグに基づいて整理するツールも、公式な構文があれば書けるはずです。
関連
-
Python カメの描画コマンドとその例
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonが解釈される場合、.pycファイルとは何ですか?
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み] Pythonの関数定義における->の意味とは?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Python カメの描画コマンドとその例
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み】Python 3.5の型ヒントは何ですか?