python 之内置模块
2021/9/18 14:34:48
本文主要是介绍python 之内置模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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 代码
这篇关于python 之内置模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享