zoukankan      html  css  js  c++  java
  • Python中通过lambda抛异常的奇技淫巧

    假设我们需要一个函数什么事都不干,只是抛出异常(在某些系统中有些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,'|2021',(),(),('x',),'','',1,''),{}
    )(Exception())
    

    # python3.x
    type(lambda: 0)(type((lambda: 0).__code__)(
        1,0,1,1,67,b'|2021',(),(),('x',),'','',1,b''),{}
    )(Exception())
    

    最后忠告:玩玩可以,慎用!

  • 相关阅读:
    消息中间件
    线程以及多线程
    锁以及分布式锁
    并发以及高并发
    SpringBoot + SpringCloud学习踩坑实记
    公众号笔记: 2018年12月
    浅谈final关键字的用法
    浅谈static关键字的四种用法
    Linux常用的一些命令
    HTTPS
  • 原文地址:https://www.cnblogs.com/taceywong/p/9264963.html
Copyright © 2011-2022 走看看