Python : 辞書(dict)をプロパティの様に参照したい
[ できるかな Python ] のコーナー
ここでは実用になるかはさておき、Pythonで出来たら楽しいって事をやってみるだけのコーナーです。
Pythonで辞書型を使ってる時に、ついつい、Javascriptのように『.』で参照しようとしてしまうってことあるよね。
ん?ない?
まあ、そういう人もいるでしょう・・・
でも、『 [ " " ] 』をタイプするのは面倒なことってあるよね。
ん?ない?
じゃあいいです。そういう人はキライです・・・
なので、私は、あるということで話を進めるのです。
何がしたいかというと・・・
member = { "name" : "あいうえ", "height" : 177 }
みたいな辞書があった時に、
Javascriptなら・・・
Javascriptの場合member["name"] member.name
上記のどちらでも参照できるってことですよ!
Pythonは上の方しかできないんだよね〜
そこで、Pythonも『.』方式で値が取れたら、うれしいなぁと・・・
といっても、やることは簡単なのですが(笑)
では早速、今回のレシピです。
<材料>
- 辞書型のオブジェクト
- 特殊メソッド__getattr__()
- 特殊メソッド__getitem__()
<作り方のポイント>
- __getattr__()メソッドの利用
- [ ]でのアクセスもできるように__getitem__()も利用
Pythonで頑張るfrom __future__ import annotations from typing import TypeVar, Generic T = TypeVar("T") class Prop(Generic[T]): def __init__(self, param: dict[str, T]) -> None: self.param = param def __getattr__(self, key: str) -> T: if isinstance(key, str): key = key.replace("_", " ") return self.param[key] def __getitem__(self, key: str) -> T: return self.param[key] def main(): members: list[dict[str, str | float | int]] = [ { "user name":"あいうえ", "weight":90.0, "height":177 }, { "user name":"Super 真理雄", "weight":250.0, "height":188 }, { "user name":"Ninja", "weight":70.5, "height":160 }, { "user name":"Mr.エックス", "weight":66.5, "height":167 }, ] for m in members: mem = Prop(m) print(f"{mem.weight:5.1f}cm {mem.height:5d}Kg : {mem.user_name}") print(f"{mem['weight']:5.1f}cm {mem['height']:5d}Kg : {mem['user name']}") if __name__ == "__main__": main()
今回は特殊メソッド__getattr__()を使えば解決です!!
簡単な料理でした。。。。。
Prop()に辞書を渡せば、『.』で参照できるオブジェクトを返してくれます。
は〜い。便利???
ちなみに、スペースはアンダースコアとして参照できるようにしてあります。
いわずもがな、Keyはstr型のみの対応です。。。
以上、腱鞘炎の予防対策でした(終)
コメント
コメントを投稿