ChatGPTに関心した話

お久しぶりです。

猫も杓子もGPTですね。

自分も例に漏れず使っているわけですが関心したことがあったのでまとめてみようかなと思いました

動機

pythonを最近よく書くのである程度詳しい認識はあるのですが、

dictを加算しつつ結合するようなメソッドが欲しいと思いました。

dictを結合する場合 | 演算子update() メソッドを用いることがよく知られていますが、それらはこのように動作します

In [2]: _d1 = {1:2, 2:3}

In [3]: _d1.update({3:4})

In [4]: _d1
Out[4]: {1: 2, 2: 3, 3: 4}

In [5]: {1:2, 2:3} | {3:4}
Out[5]: {1: 2, 2: 3, 3: 4}

これらはキーが重複していない状態では想定通りの挙動をしますが、キーがかぶっているときには安全側に倒すような挙動となります(エラーなどでずに後ろの値で上書き)

キーが重複していたときに加算してほしいなあと思ったのですがそういった実装はないのでChatGPTに聞いてみることにしました

聞いてみた

解説

だいたいコメントを読んでもらうと想定内のことが書いてありますね

なんで copy() が入っているのかというと、primitive typeを除いてpythonでは引数に参照渡しでくるのでそのまま copy() せずに代入すると引数で渡したp1の値が関数の外で想定外の値になってしまうからです

だいたいのケースでcopyせずに問題なく動くと思いますがあるとなしでは安全さが違う

これらを受けてこういうコードになった

T = TypeVar("T")

def merge_dict(src: dict[T, int], *args: Any) -> dict[T, int]:
    dest = src.copy()
    for arg in args:
        for k, v in arg.items():
            if k in dest:
                dest[k] += v
            else:
                dest[k] = v
    return dest

こういう感じにすることで

merge_dict({1: 2, 3:4}, {3:5}, {1: 8})

みたいな書き方でもちゃんと結合させることが可能

感想

  • 日本語的に若干ツッコミどころがあるのにちゃんと出力するGPTすごいぞ
    • 言語モデルがすごい。
    • AIが翻訳者の仕事を奪うとかネットの記事で書いてるのが信じられる出来
  • ていうかエラーなく動くコードがでてえらい
    • copyするのえらすぎる。これ意識して書けるのは明らかに「pythonちゃんと書いてる」やつ