python - 为什么调用python装饰函数?
问题描述
用python 3.8练习
import functools
def print_name2(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
print('2: {} has been revoked'.format(f.__name__))
return f(*args, **kwargs)
return wrapper
def print_name3(f):
print('3: {} has been revoked'.format(f.__name__))
return f
@print_name3
def my_str(i):
return str(i)
@print_name2
def my_str2(i):
return str(i)
一旦我运行代码,我得到
3: my_str has been revoked
这让我很困惑,因为我还没有进行任何函数调用
解决方案
在 python 中,装饰器在装饰点执行。您的代码等效于:
import functools
def print_name2(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
print('2: {} has been revoked'.format(f.__name__))
return f(*args, **kwargs)
return wrapper
def print_name3(f):
print('3: {} has been revoked'.format(f.__name__))
return f
def my_str(i):
return str(i)
my_str = print_name3(my_str)
def my_str2(i):
return str(i)
my_str2 = print_name2(my_str2)
我们基本上将 my_str 和 my_str2 替换为装饰器函数返回的任何内容。现在, print_name2 返回一个打印某些内容的新函数,因此没有打印任何内容。同时, print_name3 会立即打印一些内容,因为您没有将其包装在新函数中。
推荐阅读
- javascript - 为每个项目添加类
- go - 如何处理“服务器推送”http连接的关闭事件
- mysql - 使用 MySQL Workbench 添加外键时出现 MySQL 错误 1064
- json - 在 Sequelize 结果中包含资源链接
- javascript - 如何使用 Django 中用户过滤的数据库中的数据生成气泡图(Chart.js)?
- java - java.lang.VerifyError:无法从具有 Firebase 管理员的最终类继承
- python-3.x - 在 matplotlib 3-D 图上设置刻度
- javascript - 如何使用 jQuery 通过键删除 JSON 中的 JSON?
- ios - 如何将 JSON 值从一个 ViewController 传递到另一个
- r - r- 'regr.xgboost' 不支持因子输入