何时在函数内部创建嵌套函数,何时从外部调用它?

2024-05-16 20:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我见过一些具有这些结构的代码

结构1:在函数中创建内部函数

def external_func(num):
    def internal_func(num2):
        return num2*2
    return internal_func(num + 10)


test = external_func(5)
print(test)

结构2:一个函数正在调用自身外部的另一个函数

def _internal_func2(num2):
    return num2 * 2

def external_func2(num):
    return _internal_func2(num + 10)

test2 = external_func2(5)
print(test2)

对于这种特殊情况,两个函数提供相同的输出。我应该在哪里以及为什么使用这些结构中的每一个


Tags: 函数代码testreturndef情况结构num
1条回答
网友
1楼 · 发布于 2024-05-16 20:40:07

结构1的一个主要优点是,它使internal_func局部作用域成为external_func。换句话说,您明确表示internal_func只能由external_func访问。就像在external_func中定义的任何其他正则变量一样对待它。与不分散全局变量类似,有时您希望在其他函数中“隐藏”实现

然后,您可以在其他方法中使用其他类似名称的internal_func,并且它们的名称不会冲突:

In [39]: def external_func_x2(num):
    ...:     def f():
    ...:         return num * 2
    ...:     return internal_func
    ...: 

In [40]: def external_func_x3(num):
    ...:     def f():
    ...:         return num * 3
    ...:     return internal_func

一个常见目的是使函数基于某些条件生成其他函数:

In [44]: def make_multiplier(mult):
    ...:     def f(num):
    ...:         return num*mult
    ...:     return f
    ...: 

In [45]: x4 = make_multiplier(4)

In [46]: x4(8)
Out[46]: 32

In [47]: x3 = make_multiplier(3)

In [48]: x3(8)
Out[48]: 24

您可以使用结构2(或^{})执行上面相同的示例,但这样它的可读性会降低,并且您需要在外部作用域/命名空间中公开这个内部f函数,即使它仅由make_multiplier方法使用。同样,将其视为在类中隐藏方法。您还必须将参数从一个函数传递到另一个函数,而不是像结构1那样使用闭包

如果将此make_multiplier作为某个库/API的一部分,则使用结构1“隐藏”此f函数,并使库/API的客户端/用户更清楚、更可读,他们只需要“查看”该make_multiplier方法

还有一个关于可维护性的论点。如果您需要修改make_multiplier,那么显然您需要修改f,并且您可以非常确定修改f不会破坏代码的其他部分,因为除了make_multiplier之外没有人使用它

结构2是“将大功能拆分为更小、更易于管理和重用的功能”的标准良好实践。与结构1相比,它的主要优点是可测试性和可重用性。直接测试和模拟_internal_func2要容易得多,而不需要调用external_func2,如果external_func2本身调用起来特别复杂,这就非常好了。编写直接针对嵌套内部函数的测试也是非常困难的

它还使_internal_func2可被其他方法重用。与上面的结构1示例相比,如果您发现自己在许多external_func中编写相同的内部f,那么最好将其移出并转换为结构2样式

相关问题 更多 >