83

my_varNoneにできる場合、次の形式を使用するのは悪い習慣ですか?

if my_var and 'something' in my_var:
    #do something

問題は、'something' in my_varmy_varがNoneの場合にTypeErrorをスローすることです。

または私は使用する必要があります:

if my_var:
    if 'something' in my_var:
        #do something

また

try:
    if 'something' in my_var:
        #do something
except TypeError:
    pass

質問を言い換えると、Pythonのベストプラクティスは上記のどれですか(もしあれば)?

代替案は大歓迎です!

4

6 に答える 6

99

特に指摘した問題のために、条件の順序(ここではPythonリファレンス)に依存するのは安全です-一連の条件で問題を引き起こす可能性のある評価を短絡できると非常に便利です。

この種のコードは、ほとんどの言語で表示されます。

IF exists(variable) AND variable.doSomething()
    THEN ...
于 2009-04-15T15:59:25.493 に答える
39

はい、安全です。言語リファレンスで明示的かつ非常に明確に定義されています。

x and yは最初に評価し xます; の場合、その値が返されますxfalseそれ以外の場合yは評価され、結果の値が返されます。

x or yは最初に評価し xます; trueの場合x、その値が返されます。それ以外の場合yは評価され、結果の値が返されます。

于 2009-04-15T16:08:21.837 に答える
4

私はここで少し衒学者であるかもしれませんが、最良の答えは

if my_var is not None and 'something' in my_var:
    #do something

違いは、またはNoneの暗黙的な変換ではなく、の明示的なチェックです。my_varTrueFalse

あなたの場合、区別は重要ではないと確信していますが、より一般的な場合、変数がそうではなくても、たとえば整数値または空のリストにNone評価される可能性は十分にあります。False0

したがって、他のほとんどのポスターの安全であるという主張とは反対に、あなたが明示的である限り、それは安全であると私は言います。確信が持てない場合は、この非常に工夫されたクラスを検討してください。

class Contrived(object):
    def __contains__(self, s):
        return True
    def __nonzero__(self):
        return False

my_var = Contrived()
if 'something' in my_var:
    print "Yes the condition is true"
if my_var and 'something' in my_var:
    print "But this statement won't get reached."
if my_var is not None and 'something' in my_var:
    print "Whereas this one will."

はい、それは現実的な例ではないことは知っていますが、特にNoneデフォルトの関数の引数を示すためにが使用される場合、実際のコードではバリエーションが発生します。

于 2009-09-01T11:37:32.227 に答える
2

それほど単純ではありません。C#の人物として、私は次のようなことをすることに非常に慣れています。

if(x != null && ! string.isnullorempty(x.Name))
{
   //do something
}

上記はうまく機能し、期待どおりに評価されます。ただし、VB.Netでは、次の結果が予期しない結果になります。

If Not x Is Nothing **And** Not String.IsNullOrEmpty(x.Name) Then

   'do something

End If

上記は例外を生成します。正しい構文は次のとおりです。

If Not x Is Nothing **AndAlso** Not String.IsNullOrEmpty(x.Name) Then

   'do something

End If

非常に微妙な違いに注意してください。これは私を約10分間(長すぎる)混乱させました。そのため、C#(および他の)の人物は他の言語でコーディングするときに非常に注意する必要があります。

于 2009-06-05T13:31:51.000 に答える
1

私はtry/exceptを使用しますが、それは変数について何を知っているかによって異なります。

変数がほとんどの時間存在することを期待している場合、try/exceptはより少ない操作です。ほとんどの場合、変数がNoneであると予想している場合、IFステートメントの操作は少なくなります。

于 2009-04-15T16:00:04.103 に答える
0

それは完全に安全で、私はいつもそれをします。

于 2009-04-15T15:59:43.543 に答える