検索

ホームページ  >  に質問  >  本文

python - 如何交换两个shelve对象?

假定db1, db2 是shelve对象

if switch_d1_and_db2:
    func(db1, db2)
else:
    func(db2, db1)

怎么才能改写成:

if switch_d1_and_db2:
    db1, db2 = db2, db1 # 错误写法
func(db1, db2)

db1, db2 = db2, db1 肯定是不行的,怎么改写呢

PHPzPHPz2893日前668

全員に返信(1)返信します

  • 高洛峰

    高洛峰2017-04-18 09:18:15

    こんにちは、この問題をしばらく研究した結果、次の結論に達しました:

    1. それは難しすぎて、使用したい構文がやろうとしていることと一致しません

    2. 本来の方法で問題ないと思います

    3. あなたが定義した交換を実現したい場合は、あまり美しくない代替案があります。

    4. を参照してください。

    上記 3 つのポイントについて説明します。

    最初のポイントとして必要なものは次のとおりです。

    リーリー

    db1db2がどのようなオブジェクトであっても、この交換の意味は

    です

    変数 db1db2 によって最初に参照されたオブジェクトを参照し、変数 db2 が最初に db1 によって参照されたオブジェクトを参照するようにします。

    しかし、あなたがやりたいことは次のとおりです:

    db1 ファイルと db2 ファイルの内容を交換します

    よく考えてください。これら 2 つは同じではありません。別の言い方をすると、db1, db2 = db2, db1 は変数によって参照されるものを交換するだけです (変数名はデータベースのファイル名と等しくありません)。 , しかし、各ファイルの名前 コンテンツはまだ交換されていません。

    したがって、この構文を使用して交換することは、達成したい効果と一致しません

    2 番目の点については、当然のことなので詳しくは説明しませんが、気に入らないかもしれません。

    3 番目のポイントは、あまり美しくない代替手段を提供したことです。それは、shelf のプロキシ クラス ShelfProxy を単純に定義することです。このクラスは、Shelf クラスの動作をシミュレートしようとします (インターフェイスのみが似ています)。 )、オーバーロードされた演算子 ^ は交換として定義されます:

    リーリー

    私は ^ 内のコンテンツ の交換として定義します。^ を選択した理由は、これより適切なシンボルが思い浮かばないからです。一般的に、オーバーロードは行われません。このようにすると、他のクラスのインスタンスが返されるため、それほど簡単ではありませんが、便宜上、またシンプルなインターフェイスが必要なため、これを作成しました。

    次に、いくつかのテスト関数を定義します。

    リーリー

    テストコード:

    リーリー

    結果:

    リーリー

    結論

    ほとんどの場合、Shelf と同じインターフェースを使用して ShelfProxy を操作でき、全体的な効果も似ていますが、ここまで書いた後は最初からその方法を使用した方が簡単だと思いませんか?XD


    私が回答した質問: Python-QA

    返事
    0
  • キャンセル返事