繁体   English   中英

为什么调用Python时不执行包装函数?

[英]Why doesn't wrap function in Python get executed when I call it?

我有这个简单的代码。

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

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

decor(print_text())

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

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

decor(print_text())

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

decor(print_text)()

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

decor(print_text())()

TypeError:“ NoneType”对象不可调用

因为func现在是None

那是因为您只返回函数wrap-不被调用。 如果确实要调用它,则可以将结果分配给变量,也可以直接使用decor(print_text)() 请注意,您应该使用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()

您正在用单个参数调用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()函数)的返回,并且所有内容decor(print_text)打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM