首页 > 解决方案 > 如何设置闭包单元格的内容?

问题描述

以下问题显示了如何创建闭包单元对象,以便以编程方式构造带有闭包的函数。

但是,这里有一个先有鸡还是先有蛋的问题,我需要创建单元格来创建函数,但在创建函数之前,我可能无法最终确定单元格所具有的值。(作为一个疯狂的例子,如果我想把函数本身放在它的一个单元格中呢?)

有没有办法设置单元格的 cell_contents ?我尝试分配给它,但我得到一个 AttributeError 声称 cell_contents 不可写!

编辑:我刚刚意识到 cell_contents 在最新版本的 Python3 (3.7) 中是可写的,尽管不是在我正在使用的最新 pypy (3.6) 版本中。

标签: pythonpython-3.xpypy

解决方案


在 python 3.x 上,可以完成以下肮脏的技巧:

from types import FunctionType

def set_cell(cell, value):
    def cell_setter(value):
        nonlocal cell
        cell = value # pylint: disable=unused-variable
    func = FunctionType(cell_setter.__code__, globals(), "", None, (cell,)) # same as cell_setter, but with cell being the cell's contents
    func(value)

为了扩展注释,当执行 func 时,将调用 cell_setter 的代码,但将“cell”非本地映射到单元格的内容,因此分配给它会更改单元格的内容。

(我不确定在 python 2 中是否也有一种方法,而无需求助于 C 代码,如链接问题的答案。)


推荐阅读