索尼ier m9搭配mojo


Mojo的长期目标是作为Python的超集,这意味着它能够兼容现有的Python程序,无需更改即可使用Mojo编译执行。这样一来,开发者能够充分利用当前庞大的Python生态。尽管目前Mojo仍处在早期开发阶段,许多Python特性尚未实现,且尚未建立自己的生态,但它已经提供了一项重要功能:导入Python中的模块并与之交互。

这些Python代码是使用标准的Python解释器(CPython)来运行的,现有的Python代码无需任何改动即可在Mojo中运行。例如,可以轻松地导入Python中常用的numpy包,并使用其各项功能。

使用Mojo调用Python代码时,需要注意以下几点:

1. 当前不支持导入独立的成员(如包中的一个类或方法),只能导入整个Python包,然后通过包名访问其中的成员。

2. Mojo目前不支持顶层代码,即import_module()必须在函数中调用。这意味着如果在多个函数中使用Python代码,需要多次导入或在函数之间传递module的引用。尽管如此,多次导入一个module并不会多次调用包的初始化逻辑,因此不会造成明显的性能损失。

3. import_module()可能会抛出异常(如包不存在)。必须在函数中使用try/catch机制或在函数签名处增加raises关键字来处理可能的异常。

4. 除了导入Python的包外,还可以通过import_module()导入本地的Python代码,但需要使用Python.add_to_path()来增加module的路径。

5. Mojo SDK依赖于已安装的Python环境,并通过对接CPython的动态库(.so或.dylib)来使用CPython解释器。

尽管从Python中调用Mojo代码目前是不可能的,但仍有可能存在需要从Python框架中调用Mojo的情况。对于这种情况,Mojo目前尚未提供明确的解决方案。其文档中提到的替代方案是让Mojo驱动事件循环,在相应的地方分别调用Python代码或Mojo代码。并非所有需求都能通过这种方式满足,未来可能会有更好的解决方案出现。

Mojo的基础类型会隐式转换为Python的类型,支持如List、Tuple、Integer、Float、Boolean和String等类型。例如,如果一个Python文件定义了打印Python值类型的函数,我们可以通过Mojo脚本来调用此函数,输出结果显示在Mojo中也可以使用Python的类型。

当在Mojo代码中使用Python对象时,Mojo会在Python对象外围增加一个PythonObject的包装器。该包装器了许多常见的双重下划线方法(如__getitem__()和__getattr__()),并将它们传递到基础的Python对象。也可以显式地定义PythonObject。

如果你创建的Python类型在Mojo中没有对应的类型,可以使用Python.evaluate()来进行处理。例如:在一个名为m9-2.py的Python文件中定义一个函数或类时,可以使用该机制在Mojo中进行评估和调用。这样,开发者能够充分利用Python的强大功能并轻松集成到Mojo环境中。