gpt4 book ai didi

python - 为什么我会通过这个修饰函数获得多个输出?

转载 作者:行者123 更新时间:2023-12-01 03:54:07 26 4
gpt4 key购买 nike

我最近从 C/C++ 转向了 Python。难以理解闭包和装饰器。

这样声明函数(在线博客有这段代码作为示例)

def outer(some_func):
def inner():
print "Before Foo"
ret = some_func()
return ret + 1

return inner

def foo():
return 1

当我运行以下代码一次时

foo = outer(foo)
foo()

我得到的预期输出为

Before Foo
2

但是,如果我多次运行它,我会得到奇怪的输出。我不明白发生了什么。

# Writing it down twice instead of running the same cell 
# twice on my IPython notebook to better explain things here
foo = outer(foo)
foo = outer(foo)
foo()

输出结果如下

Before Foo
Before Foo
3

为什么我得到 3 作为输出,为什么“Before Foo”被打印两次?

编辑:- 当我再次装饰该函数时会发生什么?运行 foo =outer(foo) 现在已经很清楚了。当我再次运行 foo =outer(foo) 时会发生什么?

最佳答案

您正在再次装饰已装饰的函数。 outer 接受一个函数并返回闭包,它本身就是一个函数。没有什么可以阻止您将返回的函数作为参数传递给以下调用,就像您在示例中所做的那样。

如果您更改代码以打印被调用的函数并返回值,则更容易理解发生了什么:

def outer(some_func):
def inner():
print "Before inner, func: {0}".format(some_func)
ret = some_func()
print "After inner, return: {0}".format(ret + 1)
return ret + 1

return inner

def foo():
return 1

foo = outer(foo)
foo = outer(foo)
foo()

输出:

Before inner, func: <function inner at 0x7f1924b516e0>
Before inner, func: <function foo at 0x7f1924b51668>
After inner, return: 2
After inner, return: 3

关于python - 为什么我会通过这个修饰函数获得多个输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com