为什么不使用额外的括号而不调用此修饰函数?

问题描述 投票:0回答:2

我正在Sololearn上学习Python,并且遇到了这段旨在装饰函数的代码:

def decor(func):
  def wrap():
    print("============")
    func()
    print("============")
  return wrap

def print_text():
  print("Hello world!")

当我这样称呼它时decor(print_text)我刚得到这个输出<function __main__.decor.<locals>.wrap()>

要获得预期的修饰输出,我必须使用额外的一组空括号来调用该函数,例如decor(print_text)()

输出正确的结果:

============
Hello world!
============

我知道,没有这种混乱的装饰是一种更简单的方法,但是,从长远来看,我一直在其中,并且我想熟悉python如何“思考”。所以我的问题是,为什么要获得正确的输出需要额外的括号()?为什么不只使用decor(print_text)会给出正确的结果?

谢谢大家!对于冗长的问题,我深表歉意,但我正尽力解释我的想法:)

全部,我想我有关此代码的所有问题都由以下出色的人回答。谢谢大家的帮助!

python syntax decorator python-decorators
2个回答
1
投票

您的装饰器正在返回一个函数。为了调用该函数,您需要括号。

def decor(func):
  ...
  return wrap
  ...

如果是:

def decor(func):
  ...
  return wrap()
  ...

然后decor将返回调用您定义的函数wrap的结果。


1
投票

decor(print_text) 给定您的正确结果是一个功能。要调用此函数,需要括号。假设您的函数接受了一个参数:

def print_text(x):
  print("Hello " + x + "!")

–您如何看待修饰后的函数?是的,使用decor(print_text)("world")。它使事情更清晰吗?

© www.soinside.com 2019 - 2024. All rights reserved.