次のようなコードがあります:
award_dict = {
"url": "http://facebook.com",
"imageurl": "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png",
"count": 1,
}
def award(name, count, points, desc_string, my_size, parent):
if my_size > count:
a = {
"name": name,
"description": desc_string % count,
"points": points,
"parent_award": parent,
}
a.update(award_dict)
return self.add_award(a, siteAlias, alias).award
しかし、コードはかなり扱いにくいと感じました。次のように書けたらよかったと思います。
def award(name, count, points, desc_string, my_size, parent):
if my_size > count:
return self.add_award({
"name": name,
"description": desc_string % count,
"points": points,
"parent_award": parent,
}.update(award_dict), siteAlias, alias).award
update
なぜこの方法はreturn
元の辞書を使わないのでしょうか?連鎖JQuery ではどのように動作するのでしょうか? Python ではなぜ受け入れられないのでしょうか?
見るPython で 2 つの辞書を 1 つの式にマージするにはどうすればよいですか?回避策については。
ベストアンサー1
Pythonは主に実用的な色合いの実装をしているコマンドとクエリの分離: ミューテーターは戻り値を返しますNone
(;-) などの実用的な例外を伴いますpop
)。そのため、アクセサーと混同されることはありません (同様に、代入は式ではなく、ステートメントと式の分離が存在します)。
これは、本当に必要なときに物事をマージする方法がたくさんあるという意味ではありません。たとえば、返されるdict(a, **award_dict)
ことを希望している辞書とよく似た新しい辞書を作成する.update
などです。本当に重要だと感じる場合は、それを使用しないのはなぜでしょうか。
編集: ちなみに、あなたの特定のケースでは、a
途中で作成する必要もありません。
dict(name=name, description=desc % count, points=points, parent_award=parent,
**award_dict)
正確に同じ意味を持つ単一の辞書を作成しますa.update(award_dict)
(競合が発生した場合、エントリがaward_dict
明示的に指定したエントリを上書きするという事実を含みます。他の意味を取得するには、つまり、そのような競合を「勝ち取る」明示的なエントリを取得するには、award_dict
唯一の位置的引数、前にキーワード的なもの、**
形式が欠けているものdict(award_dict, name=name
などなど。