1. ホーム
  2. python

[解決済み] ある条件を満たしたときだけ、dictに追加する

2022-10-13 14:59:48

質問

私は urllib.urlencode を使用して Web POST パラメータを作成していますが、いくつかの値については None 以外の値が存在する場合にのみ追加したい値がいくつかあります。

apple = 'green'
orange = 'orange'
params = urllib.urlencode({
    'apple': apple,
    'orange': orange
})

これはうまくいくのですが、もし orange をオプションにした場合、パラメータに追加されないようにするにはどうしたらよいでしょうか?このようなものです(疑似コード)。

apple = 'green'
orange = None
params = urllib.urlencode({
    'apple': apple,
    if orange: 'orange': orange
})

これが十分に明確であったことを望みます、誰かこれを解決する方法を知っていますか?

どのように解決するのですか?

キーを別途追加する必要があります。 dict :

params = {'apple': apple}
if orange is not None:
    params['orange'] = orange
params = urllib.urlencode(params)

Pythonには条件付きでキーを定義する構文がありません。すでにすべてをシーケンスで持っているならば、dict内包を使うことができます。

params = urllib.urlencode({k: v for k, v in (('orange', orange), ('apple', apple)) if v is not None})

というのがありますが、これはあまり読みやすいものではありません。

Python 3.9以降を使用しているのであれば 新しい dict マージ演算子のサポート と条件式で指定します。

params = urllib.urlencode(
    {'apple': apple} | 
    ({'orange': orange} if orange is not None else {})
)

を使うこともできますが、私は可読性が損なわれると思うので、おそらくまだ別の if 表現を使うでしょう。

params = {'apple': apple}
if orange is not None:
    params |= {'orange': orange}
params = urllib.urlencode(params)

もう一つの方法として 辞書の解凍 を使用することもできますが、単一のキーの場合、より読みやすいとは言えません。

params = urllib.urlencode({
    'apple': apple,
    **({'orange': orange} if orange is not None else {})
})

個人的には、これは絶対に使いません。あまりにもハチャメチャで、ほとんど明示的でなく 明確 を使用するほど明確ではありません。 if ステートメントを使用するのと同じです。のように Pythonの禅 は述べています。 読みやすさを重視する。