今天扒了扒了Python解释器,记录下理解和遇到问题
首先是帮助理解
知乎链接,zhijun liu的讲解我觉得很给力.
然后是抛出异常
- 来个简单的正经代码
# 首先定义装饰器
def log(func):
def wrapper(*args, **kw):
print('call %s star' % func.__name__)
func(*args, **kw)
return wrapper
# 定义一个函数并使用装饰器
@log
def foo():
print('I am foo')
-
我对上面代码进行思考后觉得为什么不可以写成这样,里面嵌套感觉是没有必要存在的.
# 定义一个有问题的装饰器
def log_err(func):
print('不调用也会出现这句话')
return func
# 定义一个使用该装饰器的函数
@log_err
def foo1():
print('I am foo')
再然后问题描述
我对两段代码进行调试发现如果我想给foo1传入形参,修改log_err的return 就会报错,这就意味着这个写法并不通用.
其次,第一种写法print('call %s star' % func.__name__)foo的调用的时候都会输出.而在第二段代码print('call %s star' % func.__name__)即使我不调用foo1也会输出.
最后说明原因
其原因是内嵌函数是用于替代原始函数运行,而装饰器的语句是在装饰过程运行的.解释器在原始函数调用之前完成装饰的.
附录
# -*- coding: utf-8 -*-
"""
@author: 一方(AllitWell)
@contact: AllitWeller@gmail.com
@site:
@version: 1.0
@license:
@file: PyStudy1.py
@time: 2017/5/31 8:21
"""
# 首先定义装饰器
def log(func):
def wrapper(*args, **kw):
print('call %s star' % func.__name__)
func(*args, **kw)
return wrapper
# 定义一个函数并使用装饰器
@log
def foo():
print('I am foo')
# 定义一个有问题的装饰器
def log_err(func):
print('不调用也会出现这句话')
return func
# 定义一个使用该装饰器的函数
@log_err
def foo1():
print('I am foo')
if __name__ == '__main__':
foo()
# foo1()