Jos*_*osh 2 python styles inner-classes nested-function google-style-guide
我在Google 的 Python styleguide 中阅读了以下内容:
“除非关闭本地值,否则避免嵌套函数或类”。
“关闭本地值”是什么意思?
完整的相关部分如下:
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()()
Run Code Online (Sandbox Code Playgroud)
这将打印42,因为baz是bar的局部范围内的变量的闭包foo。请注意,您甚至可以反省这一点:
f = foo()
print(f.__closure__)
Run Code Online (Sandbox Code Playgroud)
所以,本质上,指南告诉你只有当嵌套函数对某些东西真正有用时才使用它,一个人为的小例子可能是函数工厂:
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))
Run Code Online (Sandbox Code Playgroud)
add2并且add5正在关闭n。
有些人可能只想嵌套一个函数只是为了将它隐藏在全局范围之外,例如:
def foo(n):
def frobnicate(x, y):
return x + y
m = n + 42
return frobnicate(m, 11)
Run Code Online (Sandbox Code Playgroud)
风格指南说不要那样做,只要做:
def frobnicate(x, y):
return x + y
def foo(n):
m = n + 42
return frobnicate(m, 11)
Run Code Online (Sandbox Code Playgroud)