要求具体到某个参数,那最好的办法自然是使用最新的语法annotations了,随手摘一段现在项目里的代码:

def _get_inner_function(f):

while hasattr(f, '__wrapped__'):

f = f.__wrapped__

return f

def _checktype(f):

_inner_f = _get_inner_function(f)

check_type_args = inspect.getfullargspec(_inner_f).annotations

if not check_type_args:

warnings.warn(UserWarning("Function " + repr(f) + " does not have annotations, checktype ignored."))

return f

@wraps(f)

async def _f(*args, **kwargs):

call_args = inspect.getcallargs(_inner_f, *args, **kwargs)

for k, v in list(call_args.items()):

if k in check_type_args:

call_args[k] = check_type(v, check_type_args[k])

return await f(**call_args)

return _f

注意_checktype这个注解在这里是用来修饰async函数的,可以自行去掉async和await。check_type是一个按规则检查类型并返回正确的值的函数,它在输入类型不符合规则的时候会抛出异常。这里使用的是 hubo1016/pychecktype 这里的实现,你也可以换成自己的实现,比如说仅仅检查是否为None。

使用方法类似于下面这样:

@_checktype

async def myfunc(self, param1: str, param2: (str, None), param3, param4: int = 0):

...

解释一下,_get_inner_function用来获取最内层的原始函数定义,这个利用了wraps修饰器在Python3最新版当中的特性,这就防止了其他装饰器对_checktype的功能造成干扰(不过也限定了其他装饰器不能修改传入参数)。annotations在Python中是函数的一部分,可以通过inspect中的函数等方法来获取,最后在装饰过的函数中比较传入的参数与注解,并进行必要的类型检查,就可以完成这个功能。链接中的check_type实现中,None值只能匹配None或者NoneType(None的类型),而不能匹配str、int等具体类型,也就实现了输入不能为None的要求。

如果要求返回值也有检查,原理也是一样的,返回值的注解可以在函数后用 -> ...的形式表述,它在annotations当中是以'return'为key的一个值。

当然这个装饰器只能在运行时检查,是没有静态检查的功能的。

python null怎么表示_[Python] @NotNull装饰器如何写比较好?相关推荐

  1. python function at 0x00000_Python 中的函数装饰器和闭包

    本文是<流畅的Python>第7章的学习笔记. 函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另 ...

  2. python进阶(小白也能看懂)——装饰器浅谈(一)

    python进阶(小白也能看懂)--装饰器(一) 第四篇 文章目录 python进阶(小白也能看懂)--装饰器(一) 1.函数基础知识 例子1.1 例子1.2 例子1.3 例子1.4 2.不带参数的装 ...

  3. Python中的property类和@property装饰器

    Python中的property类和@property装饰器 在Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法. 如果我们需要访问私有属性 ...

  4. Python 没有函数重载?如何用装饰器实现函数重载?

    摘要:Python 不支持函数重载.当我们定义了多个同名的函数时,后面的函数总是会覆盖前面的函数,因此,在一个命名空间中,每个函数名仅会有一个登记项(entry). 本文分享自华为云社区<为什么 ...

  5. 装饰器python的通俗理解_2道极好的Python算法题 | 带你透彻理解装饰器的妙用

    今天我分享两道非常好的算法题,大家耐心看完两道算法题之后,注意精华在最后,我相信大家对装饰器的理解又会更上一层楼. 1.斐波那契数列 1).这个序列非常有名,我非常喜欢这个序列(有同学问我为啥,偷偷告 ...

  6. Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析

    Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...

  7. python 三个内置装饰器,python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  8. Python 进阶_闭包 amp; 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  9. python核心装饰_《python核心编程》中高级闭包和装饰器理解?

    1.<python核心编程>的这段程序怎么理解?对于这个函数,书上说两个wraaped是闭包,但是不知道谁是自由变量. 2.代码: from time import time def lo ...

最新文章

  1. 测试眉形的有哪个软件_心理测试:你的眉形是下面的哪种?测你生来命运如何!超准...
  2. linux非lvm分区在线扩容,怎么给不是LVM的根分区扩容
  3. opencv学习笔记4:获取图像属性
  4. 2.标签CCLabelTTF,CCLabelAtlas,CCLabelBMFont
  5. jquery 学习之二 属性---文本 值
  6. 构造函数可以实例化对象
  7. SQL SERVER数据库多条件查询
  8. java学习(22):if语句
  9. java ssm 分页_ssm实现分页查询的实例
  10. 多线程矩阵乘法运算 c++
  11. 7628刷breed_路由器刷breed_Web控制台助手v5.9版本.7z
  12. python xlwt_python的xlwt模块
  13. 表格对角线两边打字_word单元格斜线 word表格中斜线表头制作过程及表头斜线两边打字怎么操作...
  14. python爬虫实践-腾讯视频弹幕分析
  15. javaweb项目实训总结_JAVA WEB实训总结
  16. Win10更新导致VMware Workstation Pro无法运行(解决+关闭Win10自动更新)
  17. 用户一键登陆,如何实现?了解一下!
  18. CentOS7下collectd简单安装使用
  19. tcp图片13包java怎么接收_13. TCP协议中的动态数据传输:应对小数据包
  20. Linux内核4.14版本——DMA Engine框架分析(2)_功能介绍及解接口分析(slave client driver)

热门文章

  1. PHP中如何防止直接访问或查看或下载config.php文件
  2. 表按某个字段,新增一个序号列
  3. 基于Udp的Socket网络编程
  4. Python进阶:并发编程之Asyncio
  5. tree(2018.10.26)
  6. 收缩sqlserver事务日志
  7. POJ3246-Balanced Lineup,好经典的题,做法和HDU-I hate it 一样~~
  8. struts2学习之基础笔记1
  9. 一天一点数据结构+算法:复习堆的知识
  10. 在Oracle 数据类型中如何使用dump函数