0

私は次のようなコードを見てきました:

nodeIds = Framework.getDataAsList(key) or []

それが変換するコードの完全な断片は何でしょうか?関数の出力は結果についてチェックされていますか、FalseそれともNone結果についてチェックされていますか?これに似たJava構文はありますか?

4

7 に答える 7

6

or短絡。左側の式が「True」である場合はそれに評価され、そうでない場合は右側の式に評価されます(「False」であっても)

左側の式が「True」の場合、右側の式は評価されません。副作用がある場合、これは重要です

「真」はbool(expression) == True
「偽」が意味することを意味しますbool(expression) == False

于 2012-08-15T07:27:23.327 に答える
2

擬似コードがあります:

def nonZero(var):
   if isinstance(var,collection): 
     if len(collection) == 0 : return False
     else: return True
   if isinstance(var, number):
     if number == 0 : return False
     else: return True
   if isinstance(var, boolean): return var
   if isinstance(var, NoneType): return False
   if hasattr(var,'__nonzero__'): return var.__nonzero__()


nodeIds = Framework.getDataAsList(key)
if not nonZero(nodeIds) : nodeIds = []
于 2012-08-15T07:19:20.617 に答える
2

より長いバージョン(Python)は次のようになります:

nodeIds = Framework.getDataAsList(key)
if not nodeIds:
    nodeIds = []

これはほぼ同じようにJavaに変換される可能性があります。

Vector<foo> nodeIds = Framework.getDataAsList(key);
if(nodeIds == null) {
    nodeIds = new Vector<foo>();
}

(私のJavaはかなり錆びています;)

'not'式の特定の値はFalseと評価されます。これは、インタラクティブなPythonコマンドラインから自分で試すことができます。

>>> not 0
... True
>>> not 1
... False
>>> not []
... True
>>> not ()
... True
>>> not True
... False
>>> not False
... True

お役に立てれば。

于 2012-08-15T07:26:30.100 に答える
1

Framework.getDataAsList(key)後続の呼び出しで同じ結果が返されると仮定すると、次のようになります。

nodeIds = Framework.getDataAsList(key) if Framework.getDataAsList(key) else []

と:

if Framework.getDataAsList(key):
    nodeIds = Framework.getDataAsList(key)
else:
    nodeIds = []

ただし、これらの例は両方とも、Framework.getDataAsList(key)1回ではなく2回の呼び出しが必要であることに注意してください。したがって、おそらくもっと正確に:

nodeIds = Framework.getDataAsList(key)
if not nodeIds:
    nodeIds = []
于 2012-08-15T07:12:56.973 に答える
1
>>> 0 or "yes"
'yes'
>>> None or "yes"
'yes'
>>> False or "yes"
'yes'
>>> [] or "yes"
'yes'
>>> "no" or "yes"
'no'

したがって、関数がそうでない値を返す場合は__nonzero__()、空のリストが割り当てられます。ブール演算子との短絡動作に関する公式チュートリアルのこの部分も参照してください。Pythonでのオブジェクトの真理値テストの詳細については、この回答も参照してください。andor

注:Python 3.0以降__bool__()、テストされています。


Javaの場合、これはおそらく三項演算子を使用して変換できます。

result = Framework.getDataAsList(key);
nodeIds = result ? result : someEmptyList();

結果オブジェクトの同等のブール変換を提供しました

于 2012-08-15T07:15:03.320 に答える
0

がチェックされFalseます。したがって、、、、、、、またはと 評価されるその他の値を返す場合Framework.getDataAsList(key)は、に[]割り当て{}られます。0""()NoneFalse[]nodeIDs

于 2012-08-15T07:13:23.830 に答える
0

このPythonイディオムは一般的であり、他のC言語のような言語の三項演算子のように割り当てで使用されます。

# python
var = value or fallback

と同等です:

/* c-like */
var = value ? value : fallback

どちらも次の擬似コードと同等です。

if value is true:
    var = value
else:
    var = fallback
于 2012-08-15T07:35:37.630 に答える