假定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
肯定是不行的,怎么改写呢
高洛峰2017-04-18 09:18:15
こんにちは、この問題をしばらく研究した結果、次の結論に達しました:
それは難しすぎて、使用したい構文がやろうとしていることと一致しません
本来の方法で問題ないと思います
あなたが定義した交換を実現したい場合は、あまり美しくない代替案があります。
上記 3 つのポイントについて説明します。
最初のポイントとして必要なものは次のとおりです。
リーリーdb1
、db2
がどのようなオブジェクトであっても、この交換の意味は
変数
db1
がdb2
によって最初に参照されたオブジェクトを参照し、変数db2
が最初にdb1
によって参照されたオブジェクトを参照するようにします。
しかし、あなたがやりたいことは次のとおりです:
db1
ファイルとdb2
ファイルの内容を交換します
よく考えてください。これら 2 つは同じではありません。別の言い方をすると、db1, db2 = db2, db1
は変数によって参照されるものを交換するだけです (変数名はデータベースのファイル名と等しくありません)。 , しかし、各ファイルの名前 コンテンツはまだ交換されていません。
したがって、この構文を使用して交換することは、達成したい効果と一致しません。
2 番目の点については、当然のことなので詳しくは説明しませんが、気に入らないかもしれません。
3 番目のポイントは、あまり美しくない代替手段を提供したことです。それは、shelf
のプロキシ クラス ShelfProxy
を単純に定義することです。このクラスは、Shelf
クラスの動作をシミュレートしようとします (インターフェイスのみが似ています)。 )、オーバーロードされた演算子 ^
は交換として定義されます:
私は ^
を 内のコンテンツ の交換として定義します。^
を選択した理由は、これより適切なシンボルが思い浮かばないからです。一般的に、オーバーロードは行われません。このようにすると、他のクラスのインスタンスが返されるため、それほど簡単ではありませんが、便宜上、またシンプルなインターフェイスが必要なため、これを作成しました。
次に、いくつかのテスト関数を定義します。
リーリーテストコード:
リーリー結果:
リーリーほとんどの場合、Shelf
と同じインターフェースを使用して ShelfProxy
を操作でき、全体的な効果も似ていますが、ここまで書いた後は最初からその方法を使用した方が簡単だと思いませんか?XD
私が回答した質問: Python-QA