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型のみの対応です。。。
以上、腱鞘炎の予防対策でした(終)
コメント
コメントを投稿