首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么装饰器显示的是内部函数名?

为什么装饰器显示的是内部函数名?
EN

Stack Overflow用户
提问于 2021-03-11 00:10:05
回答 1查看 58关注 0票数 3

我的代码如下。

代码语言:javascript
复制
#!/usr/bin/env python3

def use_logging(func):
  def _deco():
    print("%s is running" % func.__name__)
    func()
  return _deco

@use_logging
def bar():
  print('i am bar')

当我执行bar()时,输出是

代码语言:javascript
复制
bar is running
i am bar

当我执行use_logging(bar)()时,输出为_deco is running

输出:

代码语言:javascript
复制
_deco is running
bar is running
i am bar

我想知道为什么在执行use_logging(bar)()时会显示_deco is running,以及它是如何工作的?

另外,我在def _deco():之前添加了print ("hhhhhhh"),代码如下:

代码语言:javascript
复制
def use_logging(func):
  print ("hhhhhhh")
  def _deco():
    print ("_deco func")
    print("%s is running" % func.__name__)
    func()
  return _deco

@use_logging
def bar():
  print('i am bar')

当我再次执行use_logging(bar)()时,输出是:

代码语言:javascript
复制
hhhhhhh
hhhhhhh
_deco func
_deco is running
_deco func
bar is running
i am bar

first two lines都是"hhhhhhh“,你能告诉我为什么会显示the second "hhhhhhh”吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 02:50:32

因为当你这样做的时候:

代码语言:javascript
复制
use_logging(bar)() 

完成此操作后:

代码语言:javascript
复制
@use_logging
def bar():
  print('i am bar')

您正在修饰上一次调用时从装饰器返回的函数。这是语法上的糖:

代码语言:javascript
复制
bar = use_logging(bar)

日志记录返回内部定义的_deco函数。请注意,如果您:

代码语言:javascript
复制
print(bar)

你会得到:

代码语言:javascript
复制
<function use_logging.<locals>._deco at 0x7fa2c50473a0>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66568593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档