投稿

1月, 2018の投稿を表示しています

January 15, 2018 あけましておめでとうのPython

皆様あけましておめでとうございます!新年一発目はFrodoのPython! あけおめには少し、いやかなり遅い気がしないでもないですが。 で、本題。この前Javaで某MinecraftのModを作っていて思ったのですが、JavaとかC#にはオーバーロードってあるじゃないですか。Pythonは関数がオブジェクトという言語なんで同じ名前で引数違い、例えばこんなのは上書きされてしまい、期待通りの動作をしてくれません。 まあ、当たり前です。同一名前空間上に同じ名前の変数が定義できないのと一緒ですね。 じゃあ、どんな風になればよいのか?例えば、Javaでの例を出すと、こんな風になればいいのです。 ですが、Pythonでは、こんな便利な書き方はできません。...と思いますよね?これ、 内部実装 としては引数のタイプによって呼び出す関数をスイッチしてるだけなのだそう。 え、じゃあ引数タイプで呼び出す関数をスイッチするデコレータを作ればいいのでは?と思ったのです。で、作ったのがこれ。 もうちょっとどうにかしたいなぁ、とは思っているのですが。 とりあえず動くからええやん?的な乗りです。 実際の使い方はこんな感じで、関数デコレータとして使います。下のほうのコメント行は出力結果です。 関数の引数に型アノテーションをつけなかった場合その引数はobject型、要するに何でも受け付けるものとして認識されます。さらに、優先順位は上に書いたものから順番ですので一番上に可変長引数を受けるものを書いてしまうと適切にスイッチされません。 以上のことに気を付けて使えばそこそこ使えるのではないでしょうか?Javaristaの方やC#勢の方は、ぜひ使ってみてください。 Pythonがもっともっと普及しますように! Written by Frodo