![](/img/trans.png)
[英]Why doesn't this python function get executed twice in a while loop?
[英]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.