给 Python 换肤的方法不止一种:
y = lambda: (_ for _ in ()).throw(Exception('foobar'))
Lambda 接受语句。自从raise ex
是一个声明,你可以写一个通用的加注者:
def raise_(ex):
raise ex
y = lambda: raise_(Exception('foobar'))
但如果你的目标是避免def
,这显然不能解决问题。但是,它确实允许您有条件地引发异常,例如:
y = lambda x: 2*x if x < 10 else raise_(Exception('foobar'))
或者,您可以在不定义命名函数的情况下引发异常。您所需要的只是一个强大的胃(以及给定代码的 2.x):
type(lambda:0)(type((lambda:0).func_code)(
1,1,1,67,'|\0\0\202\1\0',(),(),('x',),'','',1,''),{}
)(Exception())
还有一个 python3强壮的胃解决方案:
type(lambda: 0)(type((lambda: 0).__code__)(
1,0,1,1,67,b'|\0\202\1\0',(),(),('x',),'','',1,b''),{}
)(Exception())
如果您不关心引发哪个异常,感谢@WarrenSpencer 指出了一个非常简单的答案:y = lambda: 1/0
.