こんにちは、Scalaエンジニアのnishikawaです。今回はpythonについて少し話したいと思います。
Pythonって世間では
- ライブラリが充実している
- インタプリタ言語でコーディングから実行までが手軽
という印象が強く、初心者やプログラムが本職じゃない人からも好かれる言語だと思います。特に動的型付けによりスクリプトっぽい書き味に加え、オブジェクト指向プログラミングや関数型プログラミングなど、色んなスタイルでコードを組めるのも人気の一つなのではないかと思っております。
そんなPython、書き捨てレベルのコードならいざ知らず、本気で何か組もうと思うとある問題に差し掛かります。
それは
コードを書いているうちにどのようなデータを扱っているかを見失う
ということです。
これを読んでいる人は「そんなことないでしょw」と思うかもしれませんが、少しでもそのアプリから離れると途端に何をやってたか分からなくなることは少しプログラムを組んだことある人なら誰しも経験があると思います。これは動的型付け言語あるあるだと個人的には思っています。
これを解決するには型を宣言するのが一番でPython3からではそれができます。
そもそもPythonにはどんな型があるのか
Pythonにはどんな型があるのか代表的なものと自分が少し気になったものを以下にまとめてみました。
組み込み型 | 説明 |
---|---|
bool | 真偽値 |
int | 整数 |
float | 浮動小数点数 |
complex | 複素数 |
list | リスト |
tuple | タプル |
str | 文字列 |
bytes | バイトオブジェクト |
bytearray | 可変バイトオブジェクト |
memoryview | バッファプロトコルをサポートするオブジェクトの内部データへ直にアクセスすることができるオブジェクト |
set | 集合型 |
dict | マッピングオブジェクト(俗にいう連想配列やハッシュマップ) |
複素数のcomplexやmemoryviewなんかは目からウロコでした。(複素数の型があるとか斬新w)
Pythonで型を宣言しながら変数を定義してみる
では、本題の型の宣言を行いながら変数を定義してみます。
書式は簡単で変数の直後にコロン区切りで組み込み型を定義します。
<変数名>: <組み込み型>
以下はREPLで変数宣言して値を代入し、出力した時の例
>>> zero: int = 0 >>> print(zero) 0 >>>
変数宣言時の例
>>> def test_print(txt: str): ... print(txt) ... >>> test_print("test") test >>>
実装時に型を宣言した方がいいと思った場所
ここまで型について色々書いてきましたが、最後にpythonでアプリケーションを実装する上で最低限こういう場合に型の宣言を入れておいた方がいいなと思った箇所をまとめておきます(備忘的な意味も込めて)
- メソッド宣言時の引数と返り値
- フィールドメンバー
- 生成したインスタンスを格納するための変数
メソッド宣言時の引数と返り値
メソッドを宣言する時、何をするものなのかをメソッド名に込めて実装することは多いと思いますが、メソッド名やコメントだけではどういうデータをインプットにどういうアウトプットを出すのかを見失うことがあります。そのため引数やメソッドの返り値の型を明確にすることでこの問題を回避できます。
フィールドメンバー
クラス内に定義するフィールドメンバーの型定義も重要なポイントだと思います。フィールドメンバーはクラスがどういう属性のデータを格納しているかを知るにはとてもいい情報だと思うからです。
これらの情報をしっかり書き込むことで、クラスの改修時や設計の見直しにも役立つと思います。
生成したインスタンスを格納するための変数
これはどちらかというとIDE用にあるといいなという感じです。IDEで全く型を定義しないでコーディングを行うと補完機能が使えないことが多々あります。 そのため型の定義はやった方がいいと思います。
もっと言うとIDEの機能を最大限に活かすなら全ての変数の型を定義した方がいいと思います。
まとめ
Pythonはバージョンが3になってからより多くの機能が追加されました。変数に型を明示してもどんな値も受け入れてしまうなど、依然として型の重要性は低いですが、少なくとも人間がコーディングを行う限り今回紹介した型を明示的に表記できる機能は地味ながらとても重要だと思います。
この機能を活用してpythonのコードをより良いものにしてみてはいかがでしょうか。