ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 之内置模块

2021-09-18 14:04:47  阅读:213  来源: 互联网

标签:return trace 之内 python wrapper fibonacci 模块 kwargs func


1.用 functools.wraps 定义函数修饰器

  • 装饰器可以对函数进行封装,但是会改变函数信息

  • 使用 functools 的 warps 可以解决这个问题

装饰器

def trace(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print('%s(%r, %r) -> %r' % (func.__name__, args, kwargs, result))
        return result
    return wrapper

@trace  
# 装饰器含义就是 fibonacci = trace(fibonacci)
def fibonacci(n):
    """返回第 n 个斐波那契数字。"""
    if n in (0, 1):
        return n
    return (fibonacci(n-2) + fibonacci(n-1))
fibonacci(3)
>>>
fibonacci((1,), {}) -> 1
fibonacci((0,), {}) -> 0
fibonacci((1,), {}) -> 1
fibonacci((2,), {}) -> 1
fibonacci((3,), {}) -> 2

print(fibonacci)
>>>
<function trace.<locals>.wrapper at 0x0000021B0C068700>

trace 函数所返回的值,是它内部定义的那个 wrapper。而我们又用 trace 来修饰原有的 fibonacci 函数,于是,Python 就会把修饰器内部的那个 wrapper 函数,赋值给当前模块中与原函数同名的 fibonacci 变量。对于调试器对象序列化器等需要使用内省机制的那些工具来说,这样的行为会干扰它们的正常运作。会使help函数失效:help(fibonacci)。

warps 本身也是修饰器,它可以帮助开发者编写其他修饰器。将 warps 修饰器运用到 wrapper 函数之后,它就会把与内部函数相关的元数据全部复制到外围函数。

from functools import *

def trace(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print('%s(%r, %r) -> %r' % (func.__name__, args, kwargs, result))
        return result
    return wrapper

@trace  
# 装饰器含义就是 fibonacci = trace(fibonacci)
def fibonacci(n):
    """返回第 n 个斐波那契数字。"""
    if n in (0, 1):
        return n
    return (fibonacci(n-2) + fibonacci(n-1))
print(fibonacci)
>>>
<function fibonacci at 0x0000026E0A9DE3A0>

help(fibonacci)
>>>
Help on function fibonacci in module __main__:

fibonacci(n)
    返回第 n 个斐波那契数字。

2.考虑以 contextlib 和 with 语句来改写可复用的 try/finally 代码

标签:return,trace,之内,python,wrapper,fibonacci,模块,kwargs,func
来源: https://blog.csdn.net/baidu_39638008/article/details/114981850

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有