简单点就是这种

def deco2(param=1):def _deco2(fun):def __deco2(*args, **kwargs):print (param)fun(*args, **kwargs)return __deco2return _deco2@deco2               # 错误的写法
def f2(strx):print (strx)f2('hello')

运行上面这个,期待打印1和hello

实际上是不会打印任何东西的,因为@deco2后面忘了加括号,这样就悲剧了,把f2这个函数名赋值给param了,所以运行f2函数,得到的结果是_deco2这个函数对象,并没有去运行_deco2这个函数,所以没有打印。

所以必须一定要改成@deco2(),你忘了写括号就会不运行了,感觉蒙蔽,又要去找原因。

为了支持更简洁的装饰器,和减少失误带来的错误,比如忘了写括号,下面改进一下

def deco(fun=None, param=1):def _deco(fun):def __deco(*args, **kwargs):print (param)fun(*args, **kwargs)return __decoif fun is None:return _decoelif callable(fun):return _deco(fun)else:raise ValueError("Invalid arguments provided to deco")@deco
def f(strx):print (strx)
f('hello')

这样做,少写了括号也不怕。

因为你写了括号,那么此时fun是None,他会去走if分支

如果你忘了写括号,那么此时fun的值就是函数f这个对象了,不为None他就走elif分支

这就是更兼容的带参装饰器。很多三方库里面的带参装饰器都是下面这种写法。

 

python带参装饰器的改良版相关推荐

  1. Python基础教程:带参装饰器、生成器、迭代器、for循环迭代器、枚举

    带参装饰器 装饰器为被装饰的函数添加新功能,需要外界参数 outer参数固定一个,就是func inner参数固定和被装饰的参数固定,也不能添加新参数 可以借助函数的嵌套定义,外层给内层传参 def ...

  2. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  3. React之函数式组件和高阶组件(装饰器、带参装饰器)

    import React from 'react'; // 此句不能少 import ReactDom from 'react-dom';const Wrapper = props => < ...

  4. python有参装饰器 多个装饰器装饰一个

    1.有参装饰器 基本版 def auth(argv):def wrapper(f):def inner(*args,**kwargs):f(*args,**kwargs)return innerret ...

  5. python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  6. Python无参装饰器

    需求:想要在test_func函数前后执行一些代码   1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func():return 'test_func'def test_wr ...

  7. python装饰器带参数函数_python带参数装饰器的两种写法

    python带参数装饰器的两种写法 前言 最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来 不同的写法 三层函数嵌套,实现了可传参数的一个装饰器. import logging ...

  8. 理解 Python 中的装饰器

    前言 装饰器是Python中的一个重要概念,多用于在不修改原函数的基础上,为函数增加额外的功能. 基础装饰器 例如小李给女朋友买了一款iPhone12作为生日礼物,手机原封未拆封. def gift( ...

  9. Python成长之路【第七篇】:Python基础之装饰器

    一.什么是装饰器 装饰:装饰既修饰,意指为其他函数添加新功能 器:器既函数 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器需要遵循的原则 1.不能修改装饰器的源代码(开放封闭原则) ...

最新文章

  1. 安装 | Anaconda3下载链接
  2. excel匹配_python中实现excel的高级筛选
  3. 网站前端和后台性能优化24
  4. 软件开发中 前台、中台、后台英文_最近处处惹人爱的中台到底是什么
  5. 云桌面部署_云桌面时代降临-青椒云工作站
  6. react-native 安装的时候遇到的问题
  7. 【NOIP1999】【codevs1083】Cantor表(找规律)
  8. 并发(二)——linux内核同步机制分析
  9. 定时执行自动化脚本-(一)导入保存jmeter参数至文件的jar包
  10. logback开启异步打印
  11. echarts拖拽echarts实现多条可拖动节点的折线图
  12. weblogic10.3.6安装漏洞补丁
  13. 做完一个网站重构项目的总结以及感想!
  14. AI得贤招聘官|帮助HR解决实际问题
  15. Cutting Game
  16. 微信自定义分享--失效问题
  17. 计算机电源认证,买PC电源就一定要看80Plus认证吗?
  18. 数据存、管、用一体构建企业数据安全堡垒
  19. java 错误输出_Java中的字数统计错误输出
  20. python实现逐步回归_Python怎么做逐步回归?

热门文章

  1. 搜索重复代码_LeetCode专题——详解搜索算法中的搜索策略和剪枝
  2. 1.java的基础和数据类型
  3. 软件构造 第五章第一节 可复用性的度量、形态和外部观察
  4. 《20170911-构建之法:现代软件工程-阅读笔记》
  5. ref和out区别总结
  6. Log4j详细设置说明
  7. C#中DataTable中的Compute方法使用收集
  8. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的解决方案...
  9. ios越狱系统UIGestureRecognizer事件截获问题
  10. gcc g++ Linux下动态库_静态库