2023年2月21日火曜日

できるかな Python : 辞書(dict)をプロパティの様に参照したい [ Python ]

[ できるかな 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型のみの対応です。。。



以上、腱鞘炎の予防対策でした(終)




0 件のコメント:

コメントを投稿