Skip to main content

IronPython 和 cPython 的比较

IronPython 和“标准”Python(“cPython”)之间存在一些小的差异和不兼容性。有些是 IronPython 中的直接错误,应该在以后的版本中删除。然而,其他的被认为是“实施细节”并将保留。其中一些是非常具有挑战性的话题。

对用户来说最明显的区别是字符串的处理。原始 cPython 有两种不同的字符串类型,用于“字节字符串”和“Unicode 字符串”。这个概念类似于 IEC 中的数据类型 STRING 和 WSTRING。 IronPython 只使用始终支持 Unicode 并在内部使用 UTF-16 的 .NET 字符串。然而,IronPython 实现了一个技巧来向程序员隐藏与 cPython 的差异。 (有趣的是:对于新的 Python 版本 3,开发人员完全重新设计了他们的字符串处理。结果是一个更接近 IronPython 的模型。之后总是使用 Unicode 字符串,并且有一个单独的数据类型来处理原始字节)

用 C 编写的 Python 模块无法导入 IronPython,因为 cPython 使用与 IronPython 完全不同的内部数据结构。大多数标准库模块都在 IronPython 中重新实现。但是,一些模块(例如 TK 接口)是不可用的,只要它们没有显式移植到 IronPython。另一方面,IronPython 提供对 .NET 程序集的访问,包括 .NET 框架(如上所示),这足以弥补这一特性。

虽然 cPython 使用引用计数和确定性垃圾收集器来清理循环垃圾,但 IronPython 依赖于非确定性 .NET 垃圾收集器。在大多数情况下,这种差异并不重要。但是,当您从 Python 标准库或 .NET 框架打开文件或其他资源时,您应该确保稍后关闭它们。最好使用 with 使用 Python 上下文管理器或 .NET 的语句 IDisposable 实例。

有关更多信息,请参阅: 内容经理.NET IDisposable