構造体がないならDataclassesを使えばいいじゃない
はじめに
Pythonには構造体がありません。もし複雑なデータを受け渡したい場合はクラスインスタンスを受け渡すことになります。
しかし、何も考えずにクラスを定義するとmutableになってしまいます。値を渡すならimmutableにしたいところです。
Dataclassesの出番
Python3.7から、dataclassesという便利モジュールが追加されました。それより昔はnamedtupleを使っていたのでしょうかね、知りませんけども
実際に使ってみます。
# Python3.7~
from dataclasses import dataclass
# frozen=Trueでimmutableになる
@dataclass(frozen=True)
class Hoge:
age: int
name: str
ins = Hoge(age=3, name="tallestorange")
ins.age = 100 # immutableなのでエラー発生
簡潔に書けるのでいい感じですね。
もちろん、型アノテーションとの相性も良いです。
# Python3.7~
from dataclasses import dataclass
from typing import List
@dataclass(frozen=True) # frozen=Trueでimmutableになる
class Hoge:
age: int
name: str
hoges: List[Hoge] = []
for name in ["kyomu", "tallestorange", "hogefuga"]:
hoges.append(Hoge(age=3, name=name))
print(hoges)
追記
Python3.8からはTypedDictが使えるようになったので、こっちでもいいかもしれません。
辞書の拡張なので、immutableにするには工夫が必要です。ここらへんが参考になるかもしれません。
# Python3.8~
from typing import TypedDict
class Hoge(TypedDict):
age: int
name: str
ins: Hoge = {age: 3, name: "tallestorange"}