¿Qué es una célula en el contexto de un intérprete o comstackdor?

Los objetos de código de Python tienen un atributo co_cellvars . La documentación del intérprete de bytecode de PyPy a menudo usa el término Celda .

Entre otros idiomas, Rust proporciona un tipo de datos de celda . Googlear sugiere que se relacionan con los cierres de alguna manera.

¿Qué es una célula , en el contexto de una implementación de lenguaje de progtwigción? ¿Qué problema resuelven las células?

En Python, cell objetos de cell se utilizan para almacenar las variables libres de un cierre .

Digamos que desea una función que siempre devuelve una fracción particular de su argumento. Puede utilizar un cierre para lograr esto:

 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 

Y aquí está cómo puedes usarlo:

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

¿Cómo recuerdan two_thirds los valores de n y d ? No son argumentos para la función de multiplier que el multiplier definió, no son variables locales definidas dentro de la multiply , no son globales, y dado que el multiplier ya ha terminado, sus variables locales ya no existen, ¿verdad?

Lo que sucede es que cuando se comstack el multiplier , los avisos del intérprete que multiply querrán usar sus variables locales más adelante, por lo que mantiene una nota de ellas:

 >>> multiplier.__code__.co_cellvars ('d', 'n') 

Luego, cuando se llama al multiplier , el valor de esas variables locales externas se almacena en el atributo __closure__ la función __closure__ , como una tupla de objetos de cell :

 >>> two_thirds.__closure__ (, ) 

… con sus nombres en el objeto co_freevars como co_freevars :

 >>> two_thirds.__code__.co_freevars ('d', 'n') 

Puede obtener el contenido de las celdas utilizando su atributo cell_contents :

 >>> {v: c.cell_contents for v, c in zip( two_thirds.__code__.co_freevars, two_thirds.__closure__ )} {'d': 3, 'n': 2} 

Puede leer más sobre los cierres y su implementación en la Propuesta de mejora de Python que los presentó: PEP 227 – Ámbitos estadísticamente nesteds .