ОБНОВЛЕНИЕ 2: Я был не прав!Оказывается, существует несколько способов создания оболочки для Python:
y = lambda: (_ for _ in ()).throw(Exception('foobar'))
Нет.Лямбды принимают только выражения. 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())
ОБНОВЛЕНИЕ 3: И питон3 сильный желудок решение:
type(lambda: 0)(type((lambda: 0).__code__)(
1,0,1,1,67,b'|\0\202\1\0',(),(),('x',),'','',1,b''),{}
)(Exception())
ОБНОВЛЕНИЕ 4: Спасибо @WarrenSpencer за указание на очень простой ответ, если вам все равно, какое исключение возникает: y = lambda: 1/0
.