Python中通過lambda拋異常的奇跡淫巧
阿新 • • 發佈:2018-07-04
doc func {} and 表達 什麽事 就是 expr class
假設我們需要一個函數什麽事都不幹,只是拋出異常(在某些系統中有些handler就是幹這事的),我們可以很直觀的寫出下面的代碼:
def func():
raise Exception("this is a exception")
就這麽一個簡單的功能,我們更希望用lambda實現,自然就寫下了下面的代碼:
lambda :raise Exception("this is a exception")
但遺憾的是這樣是不行的~~~會出現SyntaxError: invalid syntax
的錯誤。具體原因可以看Python Lambda
下面搜集實踐了幾種可用的奇跡淫巧:
方法一
func = lambda: (_ for _ in ()).throw(Exception('this is an exception'))
方法二
如果不在乎異常信息是什麽:
func = lambda: 1/0
不難理解,這個函數會拋出ZeroDivisionError
。這種方法其實代表了一類,比如也可以寫成:
func = lambda : [][0]
這類實現就是在lambda後面寫一定會拋出異常的表達式
方法三
一種非常陰霸的方式,只適合python3.x
func = lambda : exec('raise(Exception("this is an exception"))')
方法四:
尚未看懂的
# python2.x
type(lambda:0)(type((lambda:0).func_code)(
1,1,1,67,'|\0\0\202\1\0',(),(),('x',),'','',1,''),{}
)(Exception())
或
# python3.x type(lambda: 0)(type((lambda: 0).__code__)( 1,0,1,1,67,b'|\0\202\1\0',(),(),('x',),'','',1,b''),{} )(Exception())
最後忠告:玩玩可以,慎用!
Python中通過lambda拋異常的奇跡淫巧