「侍の原則」に従って、私は自分の関数でこれを行おうとしていますが、それは間違っているようです...
return <value> if <bool> else raise <exception>
これを行う他の「美しい」方法はありますか?ありがとう
「侍の原則」に従って、私は自分の関数でこれを行おうとしていますが、それは間違っているようです...
return <value> if <bool> else raise <exception>
これを行う他の「美しい」方法はありますか?ありがとう
どうしてもraise
表現したいなら、
def raiser(ex): raise ex
return <value> if <bool> else raiser(<exception>)
これは、関数に無条件がなかった場合にraiser()
、の戻り値を返すように「試行」します。None
raise
インライン/ターナリif
は式であり、ステートメントではありません。あなたの試みは、「boolの場合は値を返し、そうでない場合はraise expression
」の結果を返すことを意味します。これはもちろん意味がありません。これraise exception
は、それ自体が式ではなくステートメントであるためです。
これをインラインで行う方法はありません。そうしたくないはずです。明示的に行う:
if not bool:
raise MyException
return value
私はアサーションでそれを行うのが好きなので、あなたはそのメンバーが契約のようでなければならないことを強調します。
>>> def foo(self):
... assert self.value, "Not Found"
... return self.value
さて、あなたはブールを別々にテストすることができます:
if expr: raise exception('foo')
return val
そうすれば、expr
以前にテストすることができます。
三元の内部を上げる方法があります、トリックは使用すること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
>>>