当前位置: 首页 > wzjs >正文

江门市城乡建设局网站百度搜索推广收费标准

江门市城乡建设局网站,百度搜索推广收费标准,网站的新闻模块怎么做,没网站做哪个广告联盟Python 装饰器中 wraps 详解 一、装饰器核心问题:元数据丢失 (一)元数据的重要性 每个 Python 函数都自带元数据属性,如: __name__:函数名称__doc__:文档字符串__module__:所属模…

Python 装饰器中 @wraps 详解

一、装饰器核心问题:元数据丢失

(一)元数据的重要性

每个 Python 函数都自带元数据属性,如:

  • __name__:函数名称
  • __doc__:文档字符串
  • __module__:所属模块
  • __annotations__:参数类型注解

这些元数据是代码自描述性的核心,对调试、文档生成和 IDE 智能提示至关重要。

(二)问题复现实验

def simple_decorator(func):def wrapper():return func()return wrapper@simple_decorator
def calculate():"""计算圆周率近似值"""return 3.1415926print(calculate.__name__)  # 输出:wrapper
print(calculate.__doc__)   # 输出:None

此时函数名称和文档字符串被覆盖,导致:

  1. 调试时错误信息指向wrapper
  2. 自动生成的文档无法识别原始函数
  3. 类型检查工具失效

二、@wraps 解决方案深度解析

(一)底层实现原理

@wraps 通过属性拷贝实现元数据保留,主要执行以下操作:

from functools import WRAPPER_ASSIGNMENTS, WRAPPER_UPDATESdef wraps(func):def wrapper(wrapped):# 拷贝静态属性(名称、文档等)for attr in WRAPPER_ASSIGNMENTS:setattr(wrapped, attr, getattr(func, attr))# 更新动态属性(字典项)for attr in WRAPPER_UPDATES:getattr(wrapped, attr).update(getattr(func, attr, {}))return wrappedreturn wrapper

实际代码中:

  • WRAPPER_ASSIGNMENTS 包含 (__module__, __name__, __doc__ 等)
  • WRAPPER_UPDATES 包含 (__dict__, )

(二)参数化装饰器示例

带参数的装饰器同样需要@wraps

from functools import wrapsdef retry(max_attempts):def decorator(func):@wraps(func)def wrapper(*args, **kwargs):for attempt in range(max_attempts):try:return func(*args, **kwargs)except Exception as e:print(f"Attempt {attempt+1} failed: {str(e)}")raise RuntimeError(f"All {max_attempts} attempts failed")return wrapperreturn decorator@retry(max_attempts=3)
def fetch_data():"""从远程API获取数据"""# 模拟网络请求raise ConnectionError("Network unreachable")print(fetch_data.__name__)  # 输出:fetch_data
print(fetch_data.__doc__)   # 输出:从远程API获取数据

三、高级应用场景

(一)组合多个装饰器

当使用多个装饰器叠加时,@wraps确保元数据正确传递:

@decorator1
@decorator2
@decorator3
def complex_operation():"""执行复杂计算"""pass# 所有装饰器都正确使用@wraps时:
complex_operation.__name__  # 保持原函数名

(二)保留类型注解

Python 3.10+ 中,@wraps 能正确保留参数类型注解:

from typing import TypeVarT = TypeVar('T')@log_decorator
def generic_func(value: T) -> T:"""泛型函数示例"""return valueprint(generic_func.__annotations__)
# 输出:{'value': ~T, 'return': ~T}

四、元数据保留的边界条件

(一)无法自动保留的情况

以下元数据需要手动处理:

  1. 自定义属性:
    def func():pass
    func.custom_attr = 42@decorator
    def wrapped_func():passprint(hasattr(wrapped_func, 'custom_attr'))  # 输出:False
    
  2. 类方法的特殊属性:
    class MyClass:@decoratordef method(self):passMyClass.method.__qualname__  # 可能显示为wrapper的限定名
    

(二)解决方案

通过显式属性拷贝增强@wraps

def enhanced_wraps(func):def decorator(wrapper):wrapper = wraps(func)(wrapper)# 添加自定义属性拷贝wrapper.custom_attr = getattr(func, 'custom_attr', None)return wrapperreturn decorator

五、最佳实践指南

  1. 强制使用规范

    • 所有装饰器必须使用@wraps
    • 在团队代码规范中明确要求
  2. 自动化检测方案
    使用静态分析工具(如pylint)添加规则:

    # pylint规则示例
    def check_has_wraps(node):for decorator in node.decorators.nodes:if (isinstance(decorator, ast.Call) anddecorator.func.attr == 'wraps'):returnself.add_message('missing-wraps', node=node)
    
  3. 性能优化注意

    • @wraps 的元数据拷贝操作时间复杂度为 O ( 1 ) O(1) O(1)
    • 对包含大量装饰器的热路径代码,建议缓存装饰结果

六、总结

@wraps 装饰器通过维护函数身份信息,解决了装饰器模式的核心痛点。其实现原理可用如下公式表示:

装饰后函数 = @wraps ( 原函数 ) ( 装饰逻辑包裹函数 ) \text{装饰后函数} = \text{@wraps}(\text{原函数})(\text{装饰逻辑包裹函数}) 装饰后函数=@wraps(原函数)(装饰逻辑包裹函数)

掌握 @wraps 的正确用法,可以使开发者:

  1. 保持代码的透明性和可调试性
  2. 确保文档生成系统的准确性
  3. 维护类型检查系统的完整性
  4. 实现装饰器模式的工业化应用

建议在项目中建立装饰器开发规范,将 @wraps 的使用作为强制要求,并通过代码审查和静态分析工具确保规范落实。

http://www.dtcms.com/wzjs/315306.html

相关文章:

  • 部门网站建设管理典型经验材料百度的企业网站
  • 做房产网站需要了解什么东西靠谱seo外包定制
  • 专门做ppt背景的网站有哪些线上营销怎么推广
  • 西安网站架设公司全网霸屏推广系统
  • 网页设计个人简历代码北京seo优化wyhseo
  • 大连哪有做网站的打广告推广怎么做
  • 杭州网站设计步骤关键词排名批量查询软件
  • 网站建站商务平台搜索引擎营销的特点有
  • 网站建设私人接单平台电脑培训班有哪些科目
  • 做外挂网站空间今日新闻简讯30条
  • 上海影视传媒公司排名网站关键词优化
  • 陕西建设银行官网站模板建站难吗
  • 找公司做网站多少钱成都360广告推广平台
  • 公司网站建设的湖南好搜公司seo
  • 科技有限公司简介优化算法
  • .net 手机网站开发公众号关键词排名优化
  • 有专门做预算的网站没百度搜索量查询
  • 软件开发文档的作用优化网站怎么做
  • 做电商网站注意什么站内推广的方法
  • 买卖域名的网站好朋友圈产品推广文案
  • 网站图片优化大小搜索排名广告营销怎么做
  • 做阿里巴巴网站口碑西安网站seo工作室
  • seo搜索引擎优化网站seo同行网站
  • 做设计用的素材下载网站有哪些seo描述是什么
  • 内蒙古网站建设云聚seo推广一年要多少钱
  • 基于webform的网站开发品牌网络推广运营公司
  • 网站有了域名后怎么还上不了百度竞价排名点击软件
  • 运城市做网站武汉seo网站推广培训
  • 青岛网站建网站营销网
  • 网页制作免费的素材网站网站推广方式