Python 中嵌套函数模式的用例是什么?

What is the use-case for a nested function pattern in Python?

虽然围绕嵌套函数的构造和使用进行了大量讨论,但关于何时使用它们的信息却很少。我想知道的是:什么时候使用嵌套函数是惯用的?什么时候应该在嵌套函数上使用 lambda x: <function>

Python 是一种语言,可以让您做很多 不应该 的事情(即:使用全局变量)。这是一个虽然可以使用但不应该使用的功能吗?

我设想的一个场景是单元测试。假设您定义了这样一个方法:

def FunctionOne(varone: int, vartwo: object) -> None:
  assert varone == vartwo() 

vartwo是传入函数的函数。现在我们要对此进行单元测试。所以我们编写了一个(部分)单元测试,如下所示:

def unittest() -> None:
  def test_function() -> int:
    return 1
  FuncitonOne(1, test_function)

这里的具体情况是:

  1. 仅在单元测试功能范围内需要该功能。
  2. 该函数从未在别处调用。

因此,总结一下:您什么时候应该(如果有的话)将嵌套函数与 Python 一起使用?

首先,请注意嵌套函数提供了 lambda 或全局函数所没有的功能。

  • 可以是多语句,反对一个lambda
  • 它可以有一个闭包,通过反对一个全局函数

因此,只要您需要定义带有闭包的多语句函数,纯粹面向功能的答案就是使用嵌套函数。

这是此类函数的示例。

def create_counter(step):
    start = 0
    def count():
        print(start)
        start += step
    return count

请注意,该用例的另一个反复出现的例子是装饰器。

def decorator(f):
    def wrapper(*args):
        ...
        f(*args)
        ...
    return wrapper

@decorator
def my_function(*args):
    ...

您可能想要使用嵌套函数的另一个原因是在某种意义上使其成为 private,因为该函数将是本地的,无法全局访问。虽然,自从 以来,我很少看到它有用的情况,但在你的命名空间中使用辅助函数应该不会打扰你。