【发布时间】: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)
这里的细节是:
- 该函数只需要在单元测试函数的范围内。
- 该函数永远不会在其他地方调用。
因此,总结一下:什么时候应该(如果有的话)在 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