我调用它时为什么不用Python包装函数?

时间:2016-10-11 12:28:19

标签: python

我有这个简单的代码。

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

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

decor(print_text())

为什么这只打印" Hello world!"而不是两个包装?

3 个答案:

答案 0 :(得分:0)

在这里,您正在评估print_text(因此打印" Hello World!"),并将结果传递给decor

decor(print_text())

这里我们将print_text传递给decor,并调用它返回的结果函数,即wrap ::

decor(print_text)()

请注意,第一种情况不会调用从decor返回的函数。尝试调用它,看看会发生什么:

decor(print_text())()
  

TypeError:' NoneType'对象不可调用

因为func现在是None

答案 1 :(得分:0)

那是因为你只返回了函数换行 - 它没有被调用。如果您通过将结果分配给变量或直接使用decor(print_text)()来调用它。请注意,您应该使用print_text而不是print_text(),因为后者会将函数的结果赋予装饰,而不是函数本身。工作版本将是:

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

def print_text():
  print "Hello world!"

wrapped_function = decor(print_text)
wrapped_function()

答案 2 :(得分:0)

您使用单个参数调用decor。该论点是print_text()返回的任何内容。好吧,print_text()打印一些内容然后返回None。到目前为止,您的输出只是Hello world!。现在没有传递给decor,它返回wrap()函数。实际上wrap()实际上没有被调用,你的最终输出只是Hello world!

你误解了装饰器的使用。正确的语法是:

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

这是一个捷径:

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

print_text = decor(print_text)

现在您可以看到正在调用decor(print_text)wrap()函数)的返回值,并打印所有内容。