我见过一些具有这些结构的代码
结构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)
对于这种特殊情况,两个函数提供相同的输出。我应该在哪里以及为什么使用这些结构中的每一个
结构1的一个主要优点是,它使
internal_func
局部作用域成为external_func
。换句话说,您明确表示internal_func
只能由external_func
访问。就像在external_func
中定义的任何其他正则变量一样对待它。与不分散全局变量类似,有时您希望在其他函数中“隐藏”实现然后,您可以在其他方法中使用其他类似名称的
internal_func
,并且它们的名称不会冲突:一个常见目的是使函数基于某些条件生成其他函数:
您可以使用结构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样式相关问题 更多 >
编程相关推荐