Назначение лямбда х: лямбда: х - PullRequest
0 голосов
/ 04 ноября 2018

Я читал код byterun (интерпретатор Python Python), и я не могу понять строки ниже, что-то о замыкании и лямбда:

def make_cell(value):
    fn = (lambda x: lambda: x)(value) 
    return fn.__closure__[0]

Функция была вызвана во второй по последнюю строку:

class Function(object):
__slots__ = [... omit ...]

def __init__(self, name, code, globs, defaults, closure, vm):
    self._vm = vm
    self.func_code = code  
    self.func_name = self.__name__ = name or code.co_name  
    self.func_defaults = tuple(defaults)  
    self.func_globals = globs  
    self.func_locals = self._vm.frame.f_locals  
    self.__dict__ = {}  
    self.func_closure = closure  
    self.__doc__ = code.co_consts[0] if code.co_consts else None  
    kw = {
        'argdefs': self.func_defaults,
    }
    if closure:
        kw['closure'] = tuple(make_cell(0) for _ in closure)
    self._func = types.FunctionType(code, globs, **kw)  

Какова цель функции? И как это работает (особенно с 2 лямбдами)?

1 Ответ

0 голосов
/ 04 ноября 2018

Цель этой конструкции lambda x: lambda: x - создать объект ячейки замыкания , который Python использует для реализации переменных замыкания. Вложенный lambda: x использует переменную x из внешнего lambda, поэтому Python должен создать закрывающую ячейку для переменной x. Вызов внешней лямбды:

(lambda x: lambda: x)(value)

создает функциональный объект для внутреннего lambda с закрывающей ячейкой для переменной x, содержащей value, и доступом __closure__:

return fn.__closure__[0]

обращается к кортежу переменных объекта функции для получения и возврата закрывающей ячейки.

...