Python装饰器场景下hi函数用print报错为何必须使用return语句
错误原因说明
这个报错和装饰器的逻辑、print()的返回值特性直接相关,核心逻辑如下:
- Python中
print()的作用是将内容输出到控制台,它本身的返回值固定为None,你可以执行res = print('测试')后打印res验证这点。 - 你定义的
smart装饰器内部逻辑是:调用被装饰的原函数后,直接对原函数的返回值调用upper()方法,而upper()是只有字符串类型才具备的方法。 - 当
hi()函数用print('Hello World')实现时,hi()执行完成后的返回值就是print()返回的None,装饰器拿到None后调用upper()就会触发你遇到的AttributeError错误。 - 把
print改为return 'Hello World'后,hi()的返回值是字符串类型,自然可以正常调用upper()方法。
如果确实需要在hi()里用print,可以修改装饰器增加类型判断,避免调用不存在的方法:
def smart(func): def inner(): func_res = func() # 仅当返回值为字符串时调用upper方法 if isinstance(func_res, str): return func_res.upper() return func_res return inner @smart def hi(): print('Hello World') hi()
内容的提问来源于stack exchange,提问作者helloitsme
相关产品推荐
相关产品推荐

