解释器或编译器上下文中的单元是什么?

时间:2014-05-20 10:22:39

标签: python compiler-construction closures interpreter rust

Python代码对象具有属性co_cellvarsPyPy's bytecode interpreter的文档通常使用术语 Cell

其他语言中,Rust provides a Cell datatype。谷歌搜索表明他们以某种方式与封闭有关。

在编程语言实现的上下文中,什么是单元?细胞解决了什么问题?

1 个答案:

答案 0 :(得分:12)

在Python中,cell个对象用于存储free variablesclosure

让我们说你想要一个总是返回其参数特定部分的函数。您可以使用闭包来实现此目的:

def multiplier(n, d):
    """Return a function that multiplies its argument by n/d."""
    def multiply(x):
        """Multiply x by n/d."""
        return x * n / d
    return multiply

以下是如何使用它的:

>>> two_thirds = multiplier(2, 3)
>>> two_thirds(7)
4.666666666666667

two_thirds如何记住nd的值?它们不是multiply定义的multiplier函数的参数,它们不是multiply中定义的局部变量,它们不是全局变量,因为{ {1}}已经终止,其局部变量不再存在,对吗?

当编译multiplier时,解释器会注意到multiplier稍后要使用其局部变量,因此会记录它们:

multiply

然后当调用>>> multiplier.__code__.co_cellvars ('d', 'n') 时,那些外部局部变量的值存储在返回的函数的multiplier属性中,作为__closure__个对象的元组:

cell

...将>>> two_thirds.__closure__ (<cell at 0x7f7a81282678: int object at 0x88ef60>, <cell at 0x7f7a81282738: int object at 0x88ef40>) 对象中的名称设为__code__

co_freevars

您可以使用>>> two_thirds.__code__.co_freevars ('d', 'n') 属性获取单元格的内容:

cell_contents

您可以在Python Enhancement Proposal中详细了解闭包及其实现,它们介绍了它们:PEP 227 — Statically Nested Scopes