Python 进阶 (八) 编写带参数 decorator

一种白平衡增益计算中白点权重计算简易实现方式 一种白平衡白点距离权重简易实现方式 阅读详情

继续考察@log 装饰器:

def log(f):    def fn(x):        print 'call ' + f.__name__ + '()...'        return f(x)    return fn

发现对于被装饰的函数,log 打印的语句是不能变的(除了函数名)。

如果有的函数非常重要,希望打印出'[INFO] call xxx()...',有的函数不太重要,希望打印出'[DEBUG] call xxx()...',这时,log 函数本身就需要传入'INFO'或'DEBUG'这样的参数,类似这样:

@log('DEBUG')def my_func():    pass

把上面的定义翻译成高阶函数的调用,就是:

my_func = log('DEBUG')(my_func)

上面的语句看上去还是比较绕,再展开一下:

log_decorator = log('DEBUG')my_func = log_decorator(my_func)

上面的语句又相当于:

log_decorator = log('DEBUG')@log_decoratordef my_func():    pass

所以,带参数的 log 函数首先返回一个 decorator 函数,再让这个 decorator 函数接收 my_func 并返回新函数:

def log(prefix):    def log_decorator(f):        def wrapper(*args, **kw):            print '[%s] %s()...' % (prefix, f.__name__)            return f(*args, **kw)        return wrapper    return log_decorator
@log('DEBUG')def test():    passprint test()

执行结果:

[DEBUG] test()...

对于这种 3 层嵌套的 decorator 定义,你可以先把它拆开:

# 标准decorator:def log_decorator(f):    def wrapper(*args, **kw):        print '[%s] %s()...' % (prefix, f.__name__)        return f(*args, **kw)    return wrapperreturn log_decorator
# 返回decorator:def log(prefix):    return log_decorator(f)

拆开以后会发现,调用会失败,因为在 3 层嵌套的 decorator 定义中,最内层的 wrapper 引用了最外层的参数 prefix,所以,把一个闭包拆成普通的函数调用会比较困难。不支持闭包的编程语言要实现同样的功能就需要更多的代码。

在 @performance 实现打印秒的同时,请给 @performace 增加一个参数,允许传入's'或'ms':

@performance('ms')def factorial(n):    return reduce(lambda x,y: x*y, range(1, n+1))

要实现带参数的 @performance,就需要实现:

my_func = performance('ms')(my_func)

需要 3 层嵌套的 decorator 来实现。参考代码:

import timedef performance(unit):    def perf_decorator(f):        def wrapper(*args, **kw):            t1 = time.time()            r = f(*args, **kw)            t2 = time.time()            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)            print 'call %s() in %f %s' % (f.__name__, t, unit)            return r        return wrapper    return perf_decorator
@performance('ms')def factorial(n):    return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)

【人脸识别/轻量级模型】MobileFaceNet:适用于人脸识别的轻量级网络模型(文末附pytorch代码) MobileFaceNet:用于人脸识别的轻量级网络模型 阅读详情

相关推荐

Win11用户文件夹中文名修改全攻略

本文详细介绍了Windows 11系统中修改中文用户文件夹名称的完整步骤。操作包含七个关键环节:前期数据备份、账户名称修改、管理员账户激活、用户文件夹重命名、注册表路径更新、收尾操作及注意事项。特别强调需要同步修改账户名、文件夹名和注册表关联路径,并建议操作前备份重要数据。文中还针对常见问题提供了解决方案,如软件报错时的符号链接创建方法。整个过程需谨慎操作,建议在管理员权限下逐步执行,修改完成后需验证系统及软件功能是否正常。

Qinti_mm的博客 3123

python函数之参数

参数

菜鸟学识的博客 716

四、ARDUINO UNO开发板介绍

(一)ARDUINO UNO开发板 Arduino生态中包括多种开发板、模块、扩展板。其中UNO R3是最适合入门且功能齐全使用量最多的Arduino开发板。以下就是Arduino UNO R3开发板的图片。 (二)ARDUINO UNO开发板基本构成 Arduino开发板设计得非常简洁,一块AVR单片机、一个晶振或振荡器和一个5V的直流电源。常见的开发板通过一条USB数据线连接计算机。Arduino有各式各样的开发板,其中最通用的是Ardui...

简时刻的博客 7万+

python 外部传参程序编写并打包exe及其调用方式

目录 一、前言 二、python带参数程序 三、python程序打包exe 一、前言 每种编程语言相互联系又相互独立,为此使用某种编程语言编写的程序都能够独立封装和生成自己的运行程序exe或者其他的API接口。而对于这样的运行程序目的往往不是用于双击使其运行的,而是通过外部传入的参数运行其中的内核函数达到某种目的的。所以在此研究python如何编写外部传参的程序,并将其封装未exe便于外部使用。 形如VS编译器中,使用C/C++编写的程序则可以通过配置属性中常规的配置类型和调试...

nanke_yh的博客 3576

Globus 数据下载

Globus 大数据下载流程~

weixin_43978558的博客 6622

sklearn2pmml xgboost缺失值(missing)处理的坑

sklearn2pmml xgboost缺失值(missing)如何处理 今天同事在部署xgboost pmml模型时遇到了大坑,线上spark预测和本地python预测结果怎么都不对应,记录一下处理过程。 看了下同事的代码,貌似也没有问题 from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml fro...

Skycrab 8969

Python进阶(八)编写带参数decorator

拆开以后会发现,调用会失败,因为在3层嵌套的decorator定义中,最内层的wrapper引用了最外层的参数prefix,所以,把一个闭包拆成普通的函数调用会比较困难。不支持闭包的编程语言要实现同样的功能就需要更多的代码。如果有的函数非常重要,希望打印出’[INFO] call xxx()…‘,有的函数不太重要,希望打印出’[DEBUG] call xxx()…',这时,log函数本身就需要传入’发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。需要3层嵌套的decorator来实现。

IT全栈 华强工作室 4万+

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

Python进阶(八)编写带参数decorator_python 带参数的 decorator(1)

如果你打算靠自己摸索自学,那么你首先要了解学习前端的基本大纲,这是你将要学习的主要内容,理解以及掌握好这些内容,便可以找到一份初级的前端开发工作。你还需要有一套完整的前端学习教程,作为初学者最好的方式就是看视频教程学习,初学者容易理解接受。不要选择买书学习,这样的方式没有几个人能学会,基本都是看不下去书,也看不懂书。如果喜欢看书的学弟,可以买一些经典的书籍作为辅助即可,主要还是以看教程为主。每天抽出固定几个小时学习,做好长期学习的准备。

2401_84446712的博客 546

Android平台实现Airplay的方法及源代码

Airplay是由苹果公司推出的一项无线音视频传输技术,它允许用户将音频、视频和照片从iOS设备(如iPhone、iPad)或Mac电脑无线传输到支持Airplay的设备(如Apple TV、智能音箱等)。具体的解码和播放方式取决于你选择的库和技术。当Android设备启动AirplayService服务后,它将监听来自iOS设备的连接请求,并在建立连接后接收、解码和播放音视频数据。在AirplayService类的onStartCommand()方法中,我们需要处理Airplay的请求。

CyberLynxX的博客 1598

FPGA和USB3.0通信-USB3.0 PHY介绍

可以和FPGA搭配使用的USB3.0 PHY芯片通过之前的介绍<FPGA和USB3.0通信-USB3.0协议介绍USB3.0 PHY简介首先我们需要了解PHY具体完成哪些工作以及我利...

OpenFPGA的博客 4940

Python进阶(八)-编写带参数decorator

分享一下我的偶像大神的人工智能教程!http://blog.youkuaiyun.com/jiangjunshow 也欢迎转载我的文章,转载请注明出处 https://blog.youkuaiyun.com/mm2zzyzzp Python进阶(八)-编写带参数decorator   继续考察@log 装饰器: def log(f): def fn(x): ...

mm2zzyzzp的博客 171

DeerFlow 系列教程 第十六篇 | 实战案例一——用 DeerFlow 进行深度研究

在日常使用 AI Agent 时,最常见的需求之一就是对某个主题进行全面、系统的研究。多源信息采集——不能只依赖单次搜索,需要从多个角度搜索不同来源交叉验证——不同来源的信息需要相互印证,避免单一信源的偏差结构化输出——最终产出的不是零散的信息片段,而是有组织的研究报告传统做法是人工反复搜索、阅读、整理。传统手工研究: DeerFlow 深度研究:人工搜索 → 阅读页面 → 记笔记 提交研究主题│ │▼ ▼换关键词 → 再搜索 → 再阅读 ┌──────────────────┐。

weixin_43674738的博客 161

最新Python进阶(八)编写带参数decorator_python 带参数的 decorator,一口气拿了9家公司的offer

如果有的函数非常重要,希望打印出’[INFO] call xxx()…‘,有的函数不太重要,希望打印出’[DEBUG] call xxx()…另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。

2401_84413180的博客 313

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

2024年最新Python进阶(八)编写带参数decorator_python 带参数的 decorator,2024年最新面试 阿里

拆开以后会发现,调用会失败,因为在3层嵌套的decorator定义中,最内层的wrapper引用了最外层的参数prefix,所以,把一个闭包拆成普通的函数调用会比较困难。不支持闭包的编程语言要实现同样的功能就需要更多的代码。一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!网易内部VUE自定义插件库NPM集成。生产环境下如歌部署Node.js。两小时精通jq+bs插件开发。

2401_84419009的博客 312

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python之编写带参数decorator

在学习带参数的decorator之前,我们先回顾下无参数的decorator。以@log装饰器为例讲解: 无参数decorator def new_fn(f): def fn(x): print 'call '+f.__name__+'()' return f(x) return fn @new_fn def f(x): return x*x print f(2) ==> call f() ==> 4 像这种装饰器的参数除了原函数以

yjysunshine的博客 404

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python中编写带参数decorator

考察上一节的@log装饰器: def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。 如果有的函数非常重要,希望打印出'[INFO] call...

aa150602的博客 233

【python进阶】1-4 decorator装饰器 | 编写无参数decorator / 编写带参数decorator / 完善decorator

文章目录1、python中编写无参数decorator 装饰器 python内置的@语法就会使为了简化装饰器调用 装饰器的作用: 可以极大地简化代码,避免每个函数编写重复性代码 打印日志:@log 检测性能:@performance 数据库事务:@transaction URL路由:@post(’/register’) 1、python中编写无参数decorator Python的 decorat...

yipyuenkay的博客 326

Python编写带参数decorator

def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。 如果有的函数非常重要,希望打印出'[INFO] call xxx()...

Epsilon 1975

编写带参数decorator

无参的@log装饰器: def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发现对于被装饰的函数,log打印的语句是不能变的(除了函数名)。 如果有的函数非常重要,希望打印出'[INFO] call xx...

Jerome9508的博客 317

Python装饰器(decorator)系列 --- 编写带参数的装饰器

对于上一节的 @log 装饰器: from functools import reduce def log(f): def fn(x): print('call ' + f.__name__ + '()...') return f(x) return fn @log def factorial(n): return reduce(lamb...

zhf的博客 2102

python decorator. decorator_python中的decorator模块

decorator模块是python用来专门封装装饰器的模块,使用decorator构造装饰器更加简便,同时被装饰的函数签名也保留不变from decorator import decorator@decoratordef check_num(func, *args, **kwargs):if len(args) != 2:raise Exception(‘Your args number is ...

weixin_39546520的博客 451

python中decorator的用法及原理(一)

0、 概念 什么叫装饰器,其实也可以叫做包装器。即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来。 python中的装饰器分为两类:函数装饰器和类装饰器。 这里我们先讨论函数装饰器。 1. 不带参数的decorator (1) 基本用法: def decorator1(func): def dec(*args):

u013696062的专栏 2万+

Python - Decorator(装饰器) - 带参数的

我们通过以示例来看看带参数的装饰器到底怎么回事。 from time import perf_counter from functools import wraps def repeated(times): def outer(fn): @wraps(fn) def inner(*args, **kwargs): for i in range(0, times): result = fn(*args, *

zbbfb2001的博客 605

一文看懂Python系列之装饰器(decorator)(工作面试必读)

Python的装饰器(decorator)可以说是Python的一个神器,它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能。Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识。小编我当初学习Python时差点被装饰器搞晕掉,今天尝试用浅显的语言解释下Python装饰器的工作原理及如何编写自己的装饰器吧。   Python装饰器的本质   P...

大江狗 2万+

H3 Utils 实战:按场景拼出 HTTP 应用的能力地图

H3 是构建在 Web 标准上的极简 HTTP 框架,核心只负责事件、路由与中间件,业务能力全部交给一组称为 H3 Utils 的工具函数。本文按场景走一遍其内置工具:入站校验、流式响应、会话认证、反向代理、JSON-RPC,说清每个工具的默认行为与拒绝条件,方便直接搬进项目使用。 ## 快速上手 ```ts import { H3, serve, readBody, getQuery } f

gitblog_00059的博客 1035
上一篇: Python 进阶 (七) 浅谈 python3 和 Python2 的区别
下一篇: Python 进阶 (九)Python 陷阱:Nonetype
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值