web-dev-qa-db-ja.com

条件式のraiseステートメント

「侍の原則」に従って、私は自分の関数でこれを行おうとしていますが、それは間違っているようです...

return <value> if <bool> else raise <exception>

これを行う他の「美しい」方法はありますか?ありがとう

25
F.D.F.

インライン/三項ifは式であり、ステートメントではありません。あなたの試みは「ブール値の場合は値を返し、そうでない場合はraise expressionの結果を返す」ことを意味します。これはもちろん意味がありません。raise exception自体は式ではなくステートメントだからです。

これをインラインで行う方法はありません。そうするべきではありません。明示的に行う:

if not bool:
    raise MyException
return value
21
Daniel Roseman

式で絶対にraiseしたい場合は、次のことができます。

_def raiser(ex): raise ex

return <value> if <bool> else raiser(<exception>)
_

これは、関数に無条件のNoneがない場合、raiser()の戻り値を返すように「試行」します。これはraiseになります。

19
glglgl

私はアサーションでそれを行うのが好きなので、あなたはそのメンバーが契約のようでなければならないことを強調します。

>>> def foo(self):
...     assert self.value, "Not Found"
...     return self.value
2
Félix

さて、ブール値を個別にテストできます。

if expr: raise exception('foo')
return val

そうすれば、以前にexprをテストできます。

1
Marcin