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会执行三元组的第一部分,调用它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 回答