首页 > 解决方案 > 了解python内部函数。这是如何工作的?

问题描述

def prefix_factory(prefix):
    def prefix_printer(text):
        print(f"{prefix}: {text}")
    return prefix_printer

现在让我们执行下面的行。

# First time we are executing this
debug = prefix_factory('DEBUG') 

# Second time we are executing as
debug('Hello world')

我们第一次执行这个

第一次执行或将函数分配给变量 debug 被分配值“DEBUG”。我的理解是这就是它必须执行的方式。

理想情况下,内部函数 prefix_printer(text) - 在 prefix_factory() 中定义'return prefix_printer' 应该得到一个错误,说明文本不可用或文本丢失。

我们第二次执行为

debug('hello world') - 函数引用的第二次执行。第二次执行的问题是,我假设“hello world”应该被视为前缀的值。并且 text 应该是空白的,因为我们不会在 return 语句中使用任何值调用 prefix_printer。因此它必须是 '' 空字符串。我来自 c、C++ 背景。

我的问题是,它是第一次分配的同一段代码前缀,但在第二次执行调试期间('Hello world')它的行为不同。怎么可能,请详细说明这是如何工作的?

标签: pythondesign-patternsdecorator

解决方案


执行时debug = prefix_factory('DEBUG'),变量debug被赋值为调用函数的返回值prefix_factory('DEBUG')。如您所说,它没有分配值“DEBUG”。这个返回值是什么?

函数prefix_factory返回prefix_printer,它是一个嵌套在 中的函数prefix_factory。此外,还prefix_printer引用了一个prefix在外部封闭函数中定义的变量 。当prefix_factory返回一个嵌套函数时prefix_printer,它引用嵌套函数中定义的变量该返回的函数称为闭包。即使我们现在已经从对 的调用中返回,现在已经分配给变量printing_factory的闭包函数仍然具有对变量值的引用,因为它在被调用时存在。prefix_printerdebugprefixprefix_factory

随后,当您执行时debug('Hello World'),因为debug计算结果为我们的prefix_printer闭包,这相当于调用函数prefix_printer('Hello World'),变量prefix初始化为“DEBUG”。


推荐阅读