Python dict.update() がオブジェクトを返さないのはなぜですか? 質問する

Python dict.update() がオブジェクトを返さないのはなぜですか? 質問する

次のようなコードがあります:

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などなど。

おすすめ記事