我在Google的Python风格指南中阅读了以下内容:
"避免嵌套函数或类,除非关闭本地值时"。
"在局部值上关闭"是什么意思?
完整的相关部分如下:
2.6 嵌套/本地/内部类和函数
嵌套的局部函数或类在用于关闭局部变量时是可以的。内 上课很好。
2.6.1 定义
类可以在方法、函数或类中定义。函数可以在方法或函数中定义。嵌套函数对 中定义的变量具有只读访问权限 封闭范围。
2.6.2 优点
允许定义仅在非常有限的范围内使用的实用程序类和函数。非常ADT-y。常用 用于实现装饰器。
2.6.3 缺点
嵌套类或本地类的实例不能被腌制。嵌套函数和类不能直接测试。嵌套会使外部函数更长且可读性降低。
2.6.4 决定
他们很好,但有一些警告。避免嵌套函数或类,除非关闭本地值。不要嵌套 功能只是为了对模块的用户隐藏它。相反,在它的前缀 在模块级别使用 _ 命名,以便仍可由 测试。
这意味着除非你创建一个闭包。闭包是指自由变量引用封闭作用域中的变量。所以例如:
def foo():
bar = 42
def baz():
print(bar)
return baz
foo()()
这将打印42
,因为baz
是foo
局部范围内变量bar
的闭包。请注意,您甚至可以反省这一点:
f = foo()
print(f.__closure__)
因此,从本质上讲,该指南告诉您仅在嵌套函数实际上对某些事情有用时才使用嵌套函数,一个小的人为示例可能是函数工厂:
def make_adder(n):
def add(x):
return n + x
return add
add2 = make_adder(2)
add5 = make_adder(5)
print(add2(1), add5(1))
add2
和add5
是n
的关闭。
有些人可能想要嵌套一个函数只是为了将其隐藏在全局范围内,例如:
def foo(n):
def frobnicate(x, y):
return x + y
m = n + 42
return frobnicate(m, 11)
风格指南说不要那样做,只要做:
def frobnicate(x, y):
return x + y
def foo(n):
m = n + 42
return frobnicate(m, 11)