3

最近、次のパターンを頻繁に使用していることに気付きました。

x = 3
if this:
   this.process()
   if this.something:
       x = this.a_value

私はこれをしたくありません:

if this and (this.process() or True) and this.someting:
    x = this.a_value
else:
    x = 3

またはこれ:

if this:
   this.process()
   if this.something:
       x = this.a_value
   else:
       x = 3
else:
    x = 3

しかし、値を設定してから変更するのは少し面倒だと感じずにはいられません。特に、一部のユースケースではフォールバック値がほとんど使用されないことを考えると。

より良い/よりきれいな方法はありますか?

4

5 に答える 5

3

私はあなたが提示する3つのオプションについて考えます。最初のもの、つまりあなたが使用しているものが最良です。コードは明確で、誰もが何が起こっているのかを知っています。私はよりきちんとした/よりきれいな方法を考えることができません、これは私も「複雑よりも単純な方が良い」に基づいてそれをコーディングする方法です。原理

Re「値を設定してから変更するのは少し面倒だと感じずにはいられません」デフォルト値が必要な場合は、設定を回避する方法はありません。

elseそれは確かに他の2つのアプローチを使用するよりもはるかにきれいです。読みやすさが重要です。

于 2012-08-31T03:23:57.267 に答える
1

コード保守の観点から、私は最初または2番目のケースを受け入れますが、繰り返しのために3番目のケースは受け入れません。

PS:Pythonでは、通常self、クラスインスタンスオブジェクトを参照するために表示されることを期待しますが、ではありませんthisthis混乱を避けるために、その目的やその他の目的には使用しない方がよいでしょう。

于 2012-08-31T03:24:57.237 に答える
1

値を変更する必要がない最も簡単な方法は次のとおりです。

processed = False
if this:
   this.process()
   if this.something:
       x = this.a_value
       processed = True
if not processed:
    x = 3

しかし、あなたは別の変数を導入しています。デフォルト値が簡単に計算できる場合は、一番上に設定x3ます。これがデフォルト値であることが理解されます。デフォルト値の計算に時間がかかる場合は、追加のブールオプションを実行します。

于 2012-08-31T03:56:39.113 に答える
0

this.proccess()私は戻っthisてやるだろう

 try: x = this.avalue if this.process() and this.something else 3
 except AttributeError: x = 3;

(プロセスの複雑さに応じて)素晴らしくないことを除いて裸であるとしても

[編集]2番目の例は機能しないので、私はそれを取り出しました

于 2012-08-31T03:44:45.123 に答える
0

これにより、繰り返しを行わずに、最初にデフォルト値を設定することを回避できます。

def noncefunc(default):
    if this:
       this.process()
       if this.something: return this.a_value 
    return default

x = noncefunc(3)

しかし、それは特に明確ではなく、確かにあなたが持っているものよりも進歩しているわけではありません。この種のことをしたいのなら、デザインによって機能的なスタイルをより自然にサポートする言語を使うほうがよいでしょう。Pythonがその言語であればいいのですが、残念ながらそうではありません。

または:

class breakexception(exception):pass
try:
   if this:
       this.process()
       if this.something: 
          x = this.a_value
          raise breakexception()
except breakexception: pass
else: x = 3

繰り返しになりますが、これはデフォルト以外が最初に設定されていない場合にのみデフォルトを設定しますが、従うのは簡単ではありません。

ついに:

if this:
    this.process()
    if this.something: 
       x = this.a_value
try: x = x
except UnboundLocalError: x = 3

これはおそらくあなたが持っているものに代わるものの中で最も明確ですが、それはあなたの元の形よりも実際には多くの進歩を表すものではありません。

あなたが持っているものに固執する。

于 2012-08-31T04:09:24.100 に答える