import functools
def outer(func):
functools.wraps(func) # inner.__name__ = func.__name__ inner.__doc__ = func.__doc__ 伪装的更像主函数而已
def inner(*args, **kwargs): # 如果func()有参数,那装饰器之后func就等价于inner函数,所以也需要参数接收
print("原函数执行前的任务") # 当然也可以直接形象接受参数,前提是你知道原函数的参数,如inner(a,b=1,*args, **kwargs)
if False:
res = func(*args, **kwargs) # 这里是真正调用原函数,原函数如果有参数,这里肯定也得有参数啊,这里的参数从inner参数获取
return res
else:
print("原函数执行后的任务")
print("反向解析跳转登陆界面")
return inner
@outer
def func(a, b=1):
print("进入个人详情页")
# func("a", 2)
# 装饰器说明:
# 对于装饰器有一点必须要说明,不然很难理解,就是函数名是否加括号的问题
# 函数加括号表示对函数的调用
# 函数不加括号表示引用,可以理解成一个变量,指向函数代码所在的地址
# 如果上面两行不明白的,会直接在下面两句中迷茫,这也是我原来学装饰器迷茫的地方,(迷茫:一个func被赋值,然后func()就装饰器或闭包生效了)
# func添加装饰器之后 相当于是func = outer(func) 此时函数func相当于一个变量,指向outer(func)函数
# 然而 outer(func) return返回的是inner函数 return 后面的函数是不加括号的,表示引用inner函数
# 所以在执行 func函数的时候,实际上执行的是inner函数 inner函数返回原函数的值,所以在拿该值的时候会执行原来的func函数
# 在inner函数中对原函数func做了功能扩展 比如做是否登陆的判断 如果登陆了执行inner里面的return res实际上是调用原函数,比如打开个人详情页
# 运行程序,修改if判断的结果,查看装饰器运行的结果
# 当理解了上面的单个装饰器的时候再理解多个装饰器,面试题很嚣张的
def outer1(func):
functools.wraps(func) # inner.__name__ = func.__name__ inner.__doc__ = func.__doc__ 伪装的更像主函数而已
def inner1(*args, **kwargs): # 如果func()有参数,那装饰器之后func就等价于inner函数,所以也需要参数接收
print("原函数执行前的任务1") # 当然也可以直接形象接受参数,前提是你知道原函数的参数,如inner(a,b=1,*args, **kwargs)
if True:
res = func(*args, **kwargs) # 这里是真正调用原函数,原函数如果有参数,这里肯定也得有参数啊,这里的参数从inner参数获取
return res
else:
print("原函数执行后的任务1")
print("反向解析跳转登陆界面1")
return inner1
def outer2(func):
functools.wraps(func) # inner.__name__ = func.__name__ inner.__doc__ = func.__doc__ 伪装的更像主函数而已
def inner2(*args, **kwargs): # 如果func()有参数,那装饰器之后func就等价于inner函数,所以也需要参数接收
print("原函数执行前的任务2") # 当然也可以直接形象接受参数,前提是你知道原函数的参数,如inner(a,b=1,*args, **kwargs)
if True:
res = func(*args, **kwargs) # 这里是真正调用原函数,原函数如果有参数,这里肯定也得有参数啊,这里的参数从inner参数获取
return res
else:
print("原函数执行后的任务2")
print("反向解析跳转登陆界面2")
return inner2
@outer1
@outer2
def func_s(a, b=1):
print("进入个人详情页")
func_s("a", 2)
# 下面按照if的判断来做多个装饰的分析
# 首先要明白两个装饰器的闭包形式
# func_s = outer1(outer2(func_s)) # 一句话:括号里面的函数是括号外面的参数也是其内部的func(*args, **kwargs)原函数
# func_s("a", 2)
# 首先看出装饰器是从上向下执行的,先进入到outer1里面,经过判断之后执行里面的inner1函数,判断是否进入res = func(*args, **kwargs)
# 在执行outer1时,实际上执行的是inner1闭包函数,最上面说到 func = outer(func)等价于把outer的inner赋值给了func,并且在inner中扩展了功能和判断是否调用原函数func
# 所以outer1里面这个res = func(*args, **kwargs)是谁呢?他就是outer2(func_s),因为他就是outer1的参数,也是他的原函数,是对outer2的功能扩展
# 在调用outer2(func_s)的时候,就是func_s = inner2了,在inner2中对func_s做了功能扩展和判断是否调用原函数func_s
# True True
# 调用outer1装饰器,判断为真,调用res = func(*args, **kwargs)。进入outer2,outer2为真,调用func_s
"""
原函数执行前的任务1
原函数执行前的任务2
进入个人详情页
"""
# True False
# 调用outer1装饰器,判断为真,调用res = func(*args, **kwargs)。进入outer2,outer2为假,不调用func_s
"""
原函数执行前的任务1
原函数执行前的任务2
原函数执行后的任务2
反向解析跳转登陆界面2
"""
# False True
# 调用outer1装饰器,判断为假,不调用res = func(*args, **kwargs)。不进入outer2,不调用func_s
"""
原函数执行前的任务1
原函数执行后的任务1
反向解析跳转登陆界面1
"""
# False False
# 调用outer1装饰器,判断为假,不调用res = func(*args, **kwargs)。不进入outer2,不调用func_s
"""
原函数执行前的任务1
原函数执行后的任务1
反向解析跳转登陆界面1
"""
相关推荐
2026年机器学习工程师实战成长路径:问题驱动、可验证交付与AI协同调试
机器学习已从知识学习范式转向工程化问题解决范式。其核心原理在于将数学直觉锚定于真实数据裂缝,以可验证输出倒逼输入质量,并通过协作式调试构建高韧性系统。技术价值体现在显著缩短端到端交付周期(如17天跑通预测任务)、提升模型线上稳定性(如三明治调试法提前48小时捕获失效)及强化AI辅助下的精准决策能力。典型应用场景覆盖零售缺货预测、物流时效建模、实时情绪分类等强业务约束任务。本文聚焦2026年真实技术栈下的ML工程实践,深度融合Towards AI范式与可执行数学理念。
一图看懂Python嵌套装饰器
Python装饰器的多层嵌套 – Python学习笔记 今天学习了Python的装饰器,单独的一个装饰器还好,但是碰到了多层的装饰,如下: def wapper21(f): def inner(*args,**kwargs): f(*args,**kwargs) print('装饰器21') return inner def wapper22(f...
2026计算机视觉技术演进:多模态具身智能与工业鲁棒性突破
计算机视觉正从通用图像识别迈向物理可解释、工业可部署、小样本可泛化的下一代范式。其核心原理在于打破传统Transformer的全局注意力僵化结构,转向以寄存器(Register)、记忆锚点和价值序列组织的新型视觉基础模型;技术价值体现在显著提升模型在真实产线中的鲁棒性、生成结果的物理一致性及长尾场景下的概念认知能力;典型应用场景覆盖工业缺陷检测、高精度视频仿真训练、交互式小样本建模等工程一线需求。本文聚焦arXiv 2026.03.19批次701篇论文所揭示的五大技术山系,尤其深入解析Register At
[Python]多个装饰器合并
django程序,需要写很多api,每个函数都需要几个装饰器,例如 @csrf_exempt @require_POST def foo(request): pass 既然那么多个方法都需要写2个装饰器,或者多个,有啥办法把多个合并成一行呢? 上面的函数执行过程应该是 csrf_exempt(require_POST(foo)) 修改成 def compose(*
ML模型生产监控实战:特征漂移与预测熵的实时诊断体系
机器学习模型部署后失效,往往并非算法缺陷,而是数据漂移、预测不确定性升高及服务健康退化等生产环境特有问题。其核心原理在于:模型在真实流量中持续暴露于分布偏移、输入噪声和依赖波动,导致预测置信度下降与业务效果脱钩。技术价值体现在将黑盒推理转化为可观测、可证伪、可归因的工程闭环,支撑MLOps稳态运营。典型应用场景包括金融风控模型AUC突降排查、电商推荐CTR异常定位、工业质检模型误检率上升溯源等。本文聚焦轻量级、可插拔的实时监控体系构建,深度融合特征漂移检测与预测熵分析,提供开箱即用的Prometheus+G
Kimi K2.6工程级代码能力实测:长上下文、智能体编程与VS Code深度整合
AI代码助手已从‘语法补全’迈入‘工程闭环’新阶段。长上下文(如200K tokens)是支撑真实项目持续开发的基础能力,其价值不仅在于记忆长度,更在于对类名、依赖、配置等关键实体的稳定追踪;智能体编程范式则将软件工程拆解为解析→规划→调用→验证的可调度链路,实现跨工具、跨文件、带失败自愈的自动化重构。在中文技术生态适配、Django/FastAPI迁移、SHAP可视化等典型场景中,模型需同时理解语义约束与工程规范。本文基于Kimi K2.6在VS Code中的13小时连续编码实测,揭示其在长程记忆稳定性、
python装饰器通用实现
python装饰器实现通用代码
OpenClaw:本地化AI助手框架的技术解析与实践
本地化AI框架是当前企业级AI应用的重要技术方向,通过将模型推理和数据存储保留在本地环境,有效解决了数据隐私和合规性问题。OpenClaw作为新一代开源AI代理框架,采用微服务架构设计,支持Llama3、ChatGLM等主流开源模型的本地集成,并通过模块化的Skills系统实现功能扩展。其核心技术价值在于平衡了性能与灵活性——单卡RTX 3090运行70亿参数模型时响应速度可控制在3秒内,同时通过gRPC内部通信比纯HTTP方案节省约40%延迟。典型应用场景包括企业知识库助手、智能客服系统等需要数据隔离的领
Python通用装饰器的使用方法介绍
Python通用装饰器的使用方法介绍,Python通用装饰器带有参数的装饰器,通过学习通用装饰器的使用写出通用的装饰器,实现代码的运行。
字节AI Agent面试题大全及参考答案(下)
Skill 是大模型 Agent 领域对能力单元的抽象,中文常译作技能,本质是把一类可被 Agent 调用的能力做标准化封装,包含工具调用、业务流程、提示词模板、子 Agent、查询逻辑等,不局限于单纯函数调用。面试加分点,不要把 Skill 等同于普通 function call 函数,要区分 Function、Skill、MCP 三者的边界,讲清楚 Skill 不止是单个函数,可以是复杂业务流程,同时说明 MCP 协议定位是通信协议,不是能力本身。Skill 核心原理,将离散能力封装成具备元信息的独立单
钉钉Java面经及参考答案
TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自
python装饰器简介以及同时使用多个装饰器
装饰器功能: 在不改变原有函数的情况下,唯已有函数添加新功能,且不改变函数名,无需改变函数的调用 特别适用于当多个函数需要添加相同功能时 python装饰器常用于以下几点: 登录验证 记录日志 检验输入是否合理 Flask中的路由 什么是装饰器呢?装饰器如何使用? # 声明装饰器 # 使用装饰器的函数,会自动将函数名传入func变量中 def decorator(func): def ...
阻容降压 vs 开关电源:5V小功率供电方案成本与安全深度对比
本文深度对比了阻容降压电路与开关电源在5V小功率供电方案中的核心差异。重点剖析了二者在成本、体积、效率、温升及安全隔离等方面的优劣,并结合智能温控器、LED驱动等典型应用场景,为硬件工程师提供了清晰的选型决策框架,帮助在成本与安全之间做出最佳权衡。
AI Memory技术解析:从向量数据库到智能体记忆系统设计
在人工智能领域,记忆能力是构建实用智能系统的核心基础。其原理在于通过外部存储和检索机制,弥补大语言模型上下文窗口有限的短板,实现信息的持久化与关联。这项技术的核心价值在于使AI能够进行长期、连贯、个性化的交互,从而提升用户体验和任务完成效率。在应用场景上,它广泛应用于智能客服、个人助手、知识问答等需要状态维持的系统中。具体实现中,向量数据库作为检索增强生成(RAG)的关键组件,负责存储和高效召回嵌入向量化的知识片段;而智能体框架则在此基础上,整合结构化状态与摘要记忆,构建出能够管理复杂任务上下文的记忆系统。
避开SiC MOSFET驱动设计的3个大坑:电流/电阻/电压配置全指南
本文深入解析SiC MOSFET驱动设计中的三大关键参数:驱动电流、栅极电阻和工作电压,揭示常见设计误区与优化方案。通过实际案例与数据对比,指导工程师避开第三代电力电子半导体应用中的典型陷阱,提升系统可靠性与效率。特别针对驱动电源配置、栅极电阻选型等核心问题提供可落地的解决方案。
Spring Cloud Gateway 结合OAuth2提供UAA服务
微服务做用户认证和授权一直都是一个难点,随着OAuth2.0的密码模式被作废,更是难上加难了。今天胖哥群里的一个群友搭建用户认证授权体系的时候遇到了一些棘手的问题,这让胖哥觉得是时候分享一些思路出来了。 两种思路 通常微服务的认证和授权思路有两种: 所有的认证授权都由一个独立的用户认证授权服务器负责,它只负责发放Token,然后网关只负责转发请求到各个微服务模块,由微服务各个模块自行对Token进行校验处理。 另一种是网关不但承担了流量转发作用,还承担认证授权流程,当前请求的认证信息由网关中继给下游
从零实现MCP Memory:用SQLite FTS5+OKF给Agent加持久记忆
大语言模型驱动的Agent应用中,上下文管理是影响体验的关键环节。Agent在会话切换后丢失历史信息,导致开发链条断裂。传统做法依赖向量数据库和RAG,但部署重、成本高。MCP协议将记忆封装为标准工具,结合SQLite FTS5全文检索与OKF紧凑序列化格式,无需外部服务即可实现轻量级持久化记忆。SQLite提供单文件存储与事务保障,FTS5倒排索引支撑快速关键词匹配,OKF降低数据体积与解析开销。该方案适用于AI编程工具、个人Agent助手及团队知识共享等场景,为“失忆”问题提供了低成本工程解法。本文从零
信号完整性分析学习--16--传输线效应
传输线效应 说到传输线效应,大多数人都会想到一个经验法则,那就是: “当互连线的长度大于1/6倍的信号上升时间的空间延伸时,互连线就体现出传输线效应。” 上升时间越小越容易体现传输线效应。 由此可见,同一根互连线,它是否体现传输线效应,要看它要传输什么样的信号。下图所示,一根延时为15ps的互连线,当它传输上升时间为60ps的信号时就会体现传输线效应;当它传输上升时间为180ps的信号时就不体现传输线效应。
Grok4能力涌现边界实测:从评测幻觉到AGI工程化拆解
大语言模型的‘能力涌现’并非神秘突变,而是架构设计、数据工程与系统优化协同作用的结果。其核心原理在于模块化解耦——如动态计算图剪枝提升吞吐、因果连接词强化驱动跨文档推理、双轨知识机制分离静态权重与实时缓存。这种技术价值正推动AGI研发从经验式‘炼丹’转向可验证、可替换、可调试的工程范式。典型应用场景包括高精度专利分析、长上下文金融报告生成及边缘受限环境下的鲁棒部署。本文基于A100/H100/混合云三环境实测,聚焦Grok4在MMLU零样本一致性、GPQA推理链可审计性及HumanEval代码可执行性等关键
实测避坑:华为Atlas 300I DUO推理卡部署Qwen1.5,性能对比3090与完整配置流程
本文深度评测华为Atlas 300I DUO推理卡在部署Qwen1.5-14B大模型时的性能表现,并与RTX 3090进行对比。通过实测数据展示硬件参数、部署流程及性能优化建议,揭示国产AI加速卡在LLM推理中的独特优势与适用场景,为开发者提供完整的配置指南和避坑方案。
别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)
本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。
TensorFlow 2.0从零实现音乐序列建模:LSTM生成器实战
音乐生成本质上是时间序列建模问题,其核心在于捕捉音符间的长程依赖与局部走向规律。本文聚焦序列建模原理,以LSTM为技术载体,深入解析如何将MIDI转化为可学习的符号化序列,并通过滑动窗口、音高-时值联合编码、调性条件嵌入等关键设计,提升模型对旋律逻辑的理解能力。相比黑盒式AI作曲API,该方案强调可解释性与工程可控性,适用于小规模古典乐数据集,在RTX 3060等消费级GPU上即可完成端到端训练与生成。技术价值体现在对序列概率分布的显式逼近、损失函数的音乐语义定制,以及温度采样等生成策略的精细化调控。典型应
【原创】下载RealEstate10K数据集原始视频的方法
目前互联网上能搜到下载RealEstate10K数据集原始视频的方法都已经不能用了,这篇博客介绍一种目前可用的下载RealEstate10K数据集原始视频的方法,并给出自动化的脚本代码。
Qwen2.5-7B+RAG在Windows本地部署的HR数字员工实战
RAG(检索增强生成)是一种将大语言模型与外部知识库动态结合的关键技术,其核心原理是通过向量检索精准召回相关文档片段,再引导模型基于事实生成答案,从而显著降低幻觉、提升专业领域响应准确性。该技术在人力资源等强规则、高合规性场景中具备突出工程价值:既能复用企业私有制度文档,又可规避公有云数据泄露风险。结合轻量级中文大模型(如Qwen2.5-7B)与本地化向量数据库(如Milvus),可在单机Windows环境实现低延迟、高可控的AI助手落地。本文即围绕这一技术路径,详解从模型选型、vLLM推理优化到Agent
uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)
uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
Qwen2开源大模型深度解析:中文场景优化与工程化实践
大语言模型(LLM)作为当前人工智能基础设施的核心组件,其性能不仅取决于参数规模,更依赖于训练数据质量、位置编码设计、分词策略与推理优化等底层技术原理。Qwen2系列模型通过RoPE-NTK位置编码、SwiGLU+GeLU混合激活、Pre-LN架构及中文混合分词器等创新,在长文本建模、语义粒度识别与中文知识密度方面显著提升,具备面向政务、医疗、电商等垂直领域的高可用性。其配套的qwen2_utils工具包进一步降低了中文场景下的工程落地门槛,使本地部署、对话压缩、术语标准化与代码补全等任务实现开箱即用。本文
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
1108



被折叠的 条评论
为什么被折叠?



