投稿

2月, 2023の投稿を表示しています

できるかな 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):

できるかな Python : カリー化

[ できるかな Python ] のコーナー 最近、Pythonにハマってるので、いろいろとやってみた! ここでは 実用になるかはさておき 、Pythonで 出来たら楽しいって事をやってみる だけのコーナーです。 今日は、関数のカリー化です。 カリー化については、 Wikipediaでも見て くださいね。 <材料> 引数を複数とる関数 lambda式 特殊メソッド__call__() <作り方のポイント> __call__()の利用 可変引数の利用 引数展開の利用 lambda式の利用 関数呼び出し時の引数エラー(TypeError)例外の利用 カリー化 from __future__ import annotations from typing import Callable class LikeCurry: def __init__(self, func: Callable[..., any]) -> None: self.func = func def curry(self, *args: any) -> Callable[..., any]: return lambda *a: self.func(*args, *a) def __call__(self, *args: any) -> any: try: return self.func(*args) except TypeError: return LikeCurry(self.curry(*args)) def main(): def add3(a, b, c): return a + b + c add3c = LikeCurry(add3) print(add3c(2,3,4)) print(add3c(2)(3,4)) print(add3c(2,3)(4)) print(add3c(2)(3)(4)) if __name__ == "__main__": main()

Python書式:全角文字の幅問題(完成のつもり)

前回 のつづき「全角文字も揃えたい」です。 がんばっちゃったよ(笑) 暇ともいうが・・・  Pythonの書式で%sの 幅指定が文字数でカウント されるので、文字幅が全角と半角が混在すると全角分ずつずれてしまう問題の解決策をここに書いておくよ!将来の自分のために・・・ で、完成版です、はいこれ! 文字幅の指定を 負数にすると左寄せ になるのです! <追記>ついに、 禁断の手に出た ぞ俺! member.py from unicodedata import east_asian_width from functools import reduce member = [ { "name":"あいうえ", "weight":90, "height":177 }, { "name":"Super 真理雄", "weight":250, "height":188 }, { "name":"Ninja", "weight":70, "height":160 }, { "name":"Mr.エックス", "weight":66, "height":167 }, ] padstr = lambda s,w: reduce(lambda a, c: a[east_asian_width(c) in "FWA" and 2 or 1:]+c, s[::(w < 0) and -1 or 1], " "*abs(w))[::(w < 0) and -1 or 1] print("<< padstr(+) >>") for m in member: print(f'{padstr(m["name"], 15)}

Python書式:全角文字の幅問題

いやー、久しぶりにPythonやってみましたよ。 プログラミングたのしいね〜! 今回、print()関数で文字を揃えようと思って、 "%-15s" みたいな書式を指定したわけですよ!! そうしたら、なんと! 全角と半角が混在 していると、 見た目が崩れてしまう問題 がはっせい!! 全角文字幅が1文字扱い のようです!!! 「全角文字も揃えたい」ですよね〜 <<追記>> 完成のつもり版はこっち です。 member.py member = [ { "name":"あいうえ", "weight":90, "height":177 }, { "name":"Super 真理雄", "weight":250, "height":188 }, { "name":"Ninja", "weight":70, "height":160 }, { "name":"Mr.エックス", "weight":66, "height":167 }, ] for m in member: print("%-15s : %5dKg %5dcm" % (m["name"], m["weight"], m["height"])) 全角文字揃えが崩れちゃう あいうえ : 90Kg 177cm Super 真理雄 : 250Kg 188cm Ninja : 70Kg 160cm Mr.エックス : 66Kg 167cm 困りました!てなわけで、世の中の人に聞いてみると!! note.nkmk.meさんが教えてくれて いました!感謝ですな★ なんと! unicodedata.east_asian_