python带参装饰器的改良版
简单点就是这种
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带参装饰器的改良版相关推荐
- Python基础教程:带参装饰器、生成器、迭代器、for循环迭代器、枚举
带参装饰器 装饰器为被装饰的函数添加新功能,需要外界参数 outer参数固定一个,就是func inner参数固定和被装饰的参数固定,也不能添加新参数 可以借助函数的嵌套定义,外层给内层传参 def ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- React之函数式组件和高阶组件(装饰器、带参装饰器)
import React from 'react'; // 此句不能少 import ReactDom from 'react-dom';const Wrapper = props => < ...
- python有参装饰器 多个装饰器装饰一个
1.有参装饰器 基本版 def auth(argv):def wrapper(f):def inner(*args,**kwargs):f(*args,**kwargs)return innerret ...
- python带参数装饰器 函数名_python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)...
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- Python无参装饰器
需求:想要在test_func函数前后执行一些代码 1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func():return 'test_func'def test_wr ...
- python装饰器带参数函数_python带参数装饰器的两种写法
python带参数装饰器的两种写法 前言 最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来 不同的写法 三层函数嵌套,实现了可传参数的一个装饰器. import logging ...
- 理解 Python 中的装饰器
前言 装饰器是Python中的一个重要概念,多用于在不修改原函数的基础上,为函数增加额外的功能. 基础装饰器 例如小李给女朋友买了一款iPhone12作为生日礼物,手机原封未拆封. def gift( ...
- Python成长之路【第七篇】:Python基础之装饰器
一.什么是装饰器 装饰:装饰既修饰,意指为其他函数添加新功能 器:器既函数 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器需要遵循的原则 1.不能修改装饰器的源代码(开放封闭原则) ...
最新文章
- 安装 | Anaconda3下载链接
- excel匹配_python中实现excel的高级筛选
- 网站前端和后台性能优化24
- 软件开发中 前台、中台、后台英文_最近处处惹人爱的中台到底是什么
- 云桌面部署_云桌面时代降临-青椒云工作站
- react-native 安装的时候遇到的问题
- 【NOIP1999】【codevs1083】Cantor表(找规律)
- 并发(二)——linux内核同步机制分析
- 定时执行自动化脚本-(一)导入保存jmeter参数至文件的jar包
- logback开启异步打印
- echarts拖拽echarts实现多条可拖动节点的折线图
- weblogic10.3.6安装漏洞补丁
- 做完一个网站重构项目的总结以及感想!
- AI得贤招聘官|帮助HR解决实际问题
- Cutting Game
- 微信自定义分享--失效问题
- 计算机电源认证,买PC电源就一定要看80Plus认证吗?
- 数据存、管、用一体构建企业数据安全堡垒
- java 错误输出_Java中的字数统计错误输出
- python实现逐步回归_Python怎么做逐步回归?
热门文章
- 搜索重复代码_LeetCode专题——详解搜索算法中的搜索策略和剪枝
- 1.java的基础和数据类型
- 软件构造 第五章第一节 可复用性的度量、形态和外部观察
- 《20170911-构建之法:现代软件工程-阅读笔记》
- ref和out区别总结
- Log4j详细设置说明
- C#中DataTable中的Compute方法使用收集
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的解决方案...
- ios越狱系统UIGestureRecognizer事件截获问题
- gcc g++ Linux下动态库_静态库