32

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

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

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

4

5 に答える 5

29

どうしてもraise表現したいなら、

def raiser(ex): raise ex

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

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

于 2012-04-24T10:26:28.260 に答える
24

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

これをインラインで行う方法はありません。そうしたくないはずです。明示的に行う:

if not bool:
    raise MyException
return value
于 2012-04-24T10:14:08.007 に答える
2

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

>>> def foo(self):
...     assert self.value, "Not Found"
...     return self.value
于 2012-04-24T10:20:55.893 に答える
1

さて、あなたはブールを別々にテストすることができます:

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

そうすれば、expr以前にテストすることができます。

于 2012-04-24T10:12:46.277 に答える
0

三元の内部を上げる方法があります、トリックは使用することexecです:

def raising_ternary(x):
    return x if x else exec("raise Exception('its just not true')")

ご覧のとおりTrue、で呼び出すと3項の最初の部分が実行され、で呼び出すとFalse例外が発生します。

>>> def raising_ternary(x):
...     return x if x else exec("raise Exception('its just not true')")
... 
>>> raising_ternary(True)
True
>>> raising_ternary(False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in raising_ternary
  File "<string>", line 1, in <module>
Exception: its just not true
>>> 
于 2021-11-02T20:06:47.323 に答える