環境
- Python 3.13
はじめに
Pythonで開発している時に、手ぐせでの書き方でバグを生み出していたので
戒めも兼ねての備忘録です。
オブジェクトの分割代入
JavaScriptでのオブジェクトの分割代入便利ですよね。
Reactでpropsを渡す際にも、よく使うイメージです。
const {sub, body} = {sub: "件名", body: "本文"}
console.log(sub)
console.log(body)
// 件名
// 本文
辞書型の分割代入もどき
Pythonの辞書もオブジェクトと似てるし、分割代入できるでしょ!のノリで、
pylintも怒らず、やっぱ使えるのだなと意気揚々と書いていました。
sub, body = {"sub": "件名", "body": "本文"}
念のためテストで実行してみると、
値ではなく、キー名が入っており想定とは異なる結果でした。
print(sub)
print(body)
# sub
# body
調べてみると、辞書のキーがイテレータとして展開されるとのことで
Pythonの辞書型でもそれっぽい書き方はできますが、
キー名が入ってしまうので気をつけましょう。。。
おまけ
どうしても、辞書の値を分割代入をしたい際の一例は下記となります。
読みやすいかと言われると、微妙なので個人的には使わなさそうな気もします。
sub, body = ({"sub": "件名", "body": "本文"}.get(val) for val in ("sub", "body"))
print(sub)
print(body)
# 件名
# 本文
2025/10/01 追記
コメントにて、よりシンプルな書き方を共有いただいたので追記します。
values()を利用すれば、読みやすく代入が行えます。
for文と一緒に利用するイメージが強く、盲点でした。
sub, body = {"sub": "件名", "body": "本文"}.values()
print(sub)
print(body)
# 件名
# 本文
また同じように、
items()、keys()を使った場合には、対応した値が代入されます。
sub, body = {"sub": "件名", "body": "本文"}.items()
print(sub)
print(body)
# ('sub', '件名')
# ('body', '本文')
sub, body = {"sub": "件名", "body": "本文"}.keys()
print(sub)
print(body)
# sub
# body
参考
- Pythonでの辞書の分割代入 #Python - Qiita