资讯专栏INFORMATION COLUMN

【Python】使用装饰器为Python实现运行时类型检查

jonh_felix / 909人阅读

摘要:背景闲来无事想熟悉一下的装饰器写法,就写了一个简单的类型检查装饰器。思路利用带参数的装饰器直接传入变量的预期类型,然后使用检查类型。

背景
闲来无事想熟悉一下Python的装饰器写法,就写了一个简单的类型检查装饰器。
思路
利用带参数的装饰器直接传入变量的预期类型,然后使用isinstance检查类型。
代码
def typeLimits(*types, **typesdict):
    def desc(func):
        def f(*args, **kwargs):
            for i, v in enumerate(types):
                if not isinstance(args[i], v):
                    raise Exception("Need a {} where {} is not.".format(v.__name__, args[i]))
            for parm in typesdict:
                if kwargs.get(parm, None) is None:
                    raise Exception("Need parameter {}.".format(parm))
                if not isinstance(kwargs[parm],typesdict[parm]):
                    raise Exception("Need a {} for {} where {} is not.".format(typesdict[parm].__name__, parm, kwargs[parm]))
            return func(*args, **kwargs)
        return f
    return desc

@typeLimits(int, str)
def printOneIntAndOneString(n, s):
    print(n ** 2, s.upper())

@typeLimits(int, name = str)
def printOneIntAndName(n, name):
    print(n + n, name.upper())

printOneIntAndOneString(1,"abc") # 正确执行

# printOneIntAndOneString(1 + 2,3 + 4) 报错

printOneIntAndName(1, name = "aaa") 正确执行

# printOneIntAndName(1) 报错

# printOneIntAndName(1, name = 2.0) 报错
感想
这只是一个游戏之作,检查类型会耗费一些性能,真正部署运行的项目是不需要类型检查的,但可以在测试的时候使用类型检查来避免一些无谓的错误。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38177.html

相关文章

  • python_bomb----小白学装饰

    什么是装饰器? 装饰器就是用来装饰函数。 想要增强原有函数的功能 但不希望修改原有函数的定义 在代码运行期间动态增加功能的方式 函数嵌套函数 调用方式:原函数 = 外层函数(原函数名)原函数 def desc(fun): def add_info(): print(happy today) fun() print(westos_linux...

    mikasa 评论0 收藏0
  • Python学习之路26-函数装饰器和闭包

    摘要:初步认识装饰器函数装饰器用于在源代码中标记函数,以某种方式增强函数的行为。函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。只有涉及嵌套函数时才有闭包问题。如果想保留函数原本的属性,可以使用标准库中的装饰器。 《流畅的Python》笔记本篇将从最简单的装饰器开始,逐渐深入到闭包的概念,然后实现参数化装饰器,最后介绍标准库中常用的装饰器。 1. 初步认识装饰器 函数装饰...

    sunny5541 评论0 收藏0
  • python装饰器入门小结

    摘要:使用一年多了,一直知道有个装饰器,很好用,试图理解过,可能由于资料找的不好,自己的悟性太差,一直没有搞清楚,今天查了一些资料,算是理解了,现在简单记录下。 使用python一年多了,一直知道python有个装饰器,很好用,试图理解过,可能由于资料找的不好,自己的悟性太差,一直没有搞清楚,今天查了一些资料,算是理解了,现在简单记录下。python的装饰器本身的功能是在不改变已有函数本身的...

    SunZhaopeng 评论0 收藏0
  • Python内建函数大全

    摘要:类是一个在范围内的可变整数序列。因此,构造函数参数解释请参考。如果省略了,它将默认为零,并且构造函数用作像和这样的数字转换。该函数删除指定的属性只要该对象允许。返回表示当前全局符号表的字典。将整数转换为以为前缀的小写十六进制字符串。 微信公众号: Python数据科学 来源:https://juejin.im/post/5ae3ee...翻译总结自官方文档:https://docs.p...

    PascalXie 评论0 收藏0
  • flask文档学习笔记1-快速入门

    摘要:示例如下静态路由使用动态变量的路由未指定变量类型使用动态变量的路由指定变量类型指定的路由变量,可以作为被装饰的函数参数传入进来。 开始决定认真的在网上写一些东西,主要原因还是在于希望能提升学习效果。虽说python写了有几年,但是web后端框架的确没怎么接触过,买了本狗书寥寥草草的过了一遍,发现很多东西还是理解不深,真的是好记性不如烂笔头,知识也要从基础开始,退回来好好看看官方文档,再...

    lingdududu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<