3

我在Google 的 Python 样式指南中阅读了以下内容:

“避免嵌套函数或类,除非关闭局部值”。

“关闭局部值”是什么意思?

完整的相关部分如下:

2.6 嵌套/局部/内部类和函数

当用于关闭局部变量时,嵌套的局部函数或类很好。内部课程很好。

2.6.1 定义

类可以在方法、函数或类中定义。可以在方法或函数内部定义函数。嵌套函数对封闭范围中定义的变量具有只读访问权限。

2.6.2 优点

允许定义仅在非常有限的范围内使用的实用程序类和函数。非常ADT-y。常用于实现装饰器。

2.6.3 缺点

嵌套类或本地类的实例不能被腌制。嵌套函数和类不能直接测试。嵌套可以使您的外部函数更长且可读性更低。

2.6.4 决定

他们很好,有一些警告。避免嵌套函数或类,除非关闭局部值。不要嵌套函数只是为了对模块的用户隐藏它。取而代之的是,在模块级别使用 _ 作为其名称的前缀,以便测试仍然可以访问它。

4

1 回答 1

5

这意味着除非你创建一个闭包。闭包是指自由变量引用封闭范围内的变量。例如:

def foo():
    bar = 42
    def baz():
        print(bar)
    return baz
foo()()

这将打印出来42,因为它是对局部范围内baz的变量的闭包。请注意,您甚至可以自省:barfoo

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)
于 2020-05-16T03:00:59.353 回答