我该如何优雅地在我的函数中实现"武士道原则"(要么胜利归来,要么战死沙场)?
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()
的返回值,如果函数中没有无条件的raise
语句,则返回值将为None
。
{'f': os.environ.get('FOO') or raise_foobar(), ...}
- Kevin三元/内联 if
是一个表达式,而不是语句。你的尝试意味着“如果布尔值为真,返回值,否则返回raise expression
的结果”-当然这是无意义的,因为raise exception
本身就是一个语句而不是表达式。
没有办法内联实现这个操作,而且你也不应该这样做。请显式地完成它:
if not bool:
raise MyException
return value
在三元运算符中提升变量的方法是使用 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
>>>
exec()
是危险的,不应该以这种方式使用。 - dataviews我喜欢使用断言来强调成员必须存在,就像签订合同一样。
>>> def foo(self):
... assert self.value, "Not Found"
... return self.value
好的,你可以单独测试布尔值:
if expr: raise exception('foo')
return val
这样,您可以更早地测试expr
。