【问题标题】:What is the use-case for a nested function pattern in Python?Python中嵌套函数模式的用例是什么?
【发布时间】:2020-05-07 19:18:51
【问题描述】:

虽然有很多关于嵌套函数的构造和使用的讨论,但关于何时使用它们的信息却很少。我想找出的是:什么时候使用嵌套函数是惯用的?什么时候应该在嵌套函数上使用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 中使用嵌套函数?

【问题讨论】:

  • 网络上的很多墨水都专门用于这个主题。这是一本好书:realpython.com/inner-functions-what-are-they-good-for
  • @PaulH 感谢您提供此链接,看起来我的“嵌套函数”术语可能是研究时的绊脚石。
  • 真正的问题是什么时候应该使用lambda?几乎,您应该使用lambda 的唯一时间是用于任何匿名函数。实际上,这主要是 style 的问题。 lambda 没有什么是完整函数定义不提供的,而且完整函数定义可以做 lambda 做不到的事情。请注意,Guido 实际上想在从 Python 2 到 3 的过渡中删除 lambda。
  • 现在,您唯一应该嵌套函数的情况是,如果您需要在每次调用外部函数时创建一个新函数。对于返回函数的高阶函数,或者利用嵌套函数创建的闭包的函数,通常就是这种情况。
  • 我认为要理解的重要部分是“嵌套函数”实际上只是在函数中创建对象的情况......函数只是对象。您可以将def foo(...): ... 视为对function 类构造函数的调用的语法糖,所以foo = function(...) 这实际上是可能的,尽管您几乎不需要调用实际的函数构造函数,而且它不是用户友好的

标签: python lambda inner-classes pep8


【解决方案1】:

首先,请注意嵌套函数提供了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):
    ...

您可能想要使用嵌套函数的另一个原因是在某种意义上使其私有,因为该函数将是本地的并且无法全局访问。虽然,我看到很少有这种情况有用,因为 choosing proper function names,但它不应该打扰您在命名空间中使用辅助函数。

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2013-03-03
    • 2019-07-24
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多