Skip to main content

Comparación de IronPython y cPython

Existen algunas pequeñas diferencias e incompatibilidades entre IronPython y Python "estándar" ("cPython"). Algunos son errores directos en IronPython y deben eliminarse en futuras versiones. Sin embargo, otros se consideran "detalles de implementación" y permanecerán. Algunos de ellos son temas muy desafiantes.

La diferencia más obvia para los usuarios es el manejo de cadenas. El cPython original tiene dos tipos de cadenas diferentes para "cadenas de bytes" y "cadenas Unicode". Este concepto es similar a los tipos de datos STRING y WSTRING en IEC. IronPython simplemente usa cadenas .NET que siempre son compatibles con Unicode y usan UTF-16 internamente. Sin embargo, IronPython implementa un truco para ocultar al programador la diferencia con cPython. (Interesante: para la nueva versión 3 de Python, los desarrolladores han reelaborado completamente su manejo de cadenas. El resultado fue un modelo mucho más cercano a IronPython. Después de eso, siempre se usan cadenas Unicode y hay un tipo de datos separado para manejar bytes sin formato)

Los módulos de Python que están escritos en C no se pueden importar a IronPython porque cPython usa estructuras de datos internas que son completamente diferentes de IronPython. La mayoría de los módulos de la biblioteca estándar se reimplementaron en IronPython. Sin embargo, algunos módulos (como la interfaz TK) no están disponibles mientras no se transfieran explícitamente a IronPython. Por otro lado, IronPython brinda acceso a ensamblados .NET, incluido el marco .NET (como se muestra arriba), que compensa con creces esta función.

Mientras que cPython utiliza el recuento de referencias y un recolector de basura determinista para limpiar la basura cíclica, IronPython se basa en el recolector de basura no determinista de .NET. En la mayoría de los casos, esta diferencia no importa. Pero cuando abre archivos u otros recursos de la biblioteca estándar de Python o del marco .NET, debe asegurarse de cerrarlos más tarde. Lo mejor es usar el with declaración con el administrador de contexto de Python o .NET IDisposable instancias.

Para más información, ver: Administradores de contenido y .NET IDesechable