aardio 文档

py2.export 库模块帮助文档

重要说明

一、简介

当 py2.export() 作为对象构造函数使用时, 可用于导入参数指定的 aardio 对象为 Python 对象。 这种「代理对象」在 Python 中将保持对原始 aardio 对象的引用, 也就是传址而非传值,可以在 Python 中更直接地使用此 aardio 对象。

二、解决了什么问题

首先请了解 aardio 在与 Python 交互时, 默认除了布尔值、浮点数值、小于53位的整数值,布尔值转换为纯 aardio 值以外。 在 aardio 这些对象存为 pyObject,并保留对原始 Python 对象的引用。

pyObject 也像普通 aardio 对象 一样可以 支持许多 aardio 操作符以及 _tostring,_tonumber 等元方法。

调用 pyObject.parseValue() 可将 pyObject 转换为纯 aardio 值。 调用 pyObject.parseValue(true) 可将布尔值、浮点数值、小于53位的整数值,布尔值转换为纯 aardio 值。 其他类型对象保留不变返回自身,在调用 Python 时,aardio 默认对所有 Python 返回的对象调用 pyObject.parseValue(true) 。

aardio 对象在自动转换为 Python 对象时, aardio 则只转换数据,即传值而非传址,Python 中不保留对 aardio 对象的引用。 例如 aardio 表对象,经过 JSON 作为中间协议转换为纯 Python 对象。

这样带来的好处是在 Python 中可以获得纯 Python 对象,用起来非常简洁。 但缺点是这种转换后的对象不再引用原始的 aardio 对象, 也就因此失去了在 Python 中全面操控和利用 aardio 对象的能力。

我们可以利用 py2.export 导出 aardio 模块,例如:

py2.export.aardio = {
    exportFunction = function(){

    } 
}

然后可以在 Python 中 import aardio,然后调用这个模块的所有成员函数。 你可以使用不同的模块名称,不一定要是 aardio。

但这种导出的模块,仍然遵守前述的规则, aardio 对象传入 Python 仍是传值而不是传址。

三、py3.export( aardioObject ) 使用要点

但我们用 py2.export( aardioObject ) 就可以用传址的方式导出 aardio 代理对象给 Python, 这种方式支持传址转换 table,cdata,class,function 等 aardio 对象,也可以支持导出 aardio 迭代器 并且于 Python 的 for 语句(注意 aardio 迭代器在 Python 中返回 tuple 而非单个值)

对于整型数值 py2.export( number ) 默认转换为 Python 中的整型,而非浮点数。 对于其他类型,例如字符串等则不作转换直接返回(当作为 Python 函数的参数时,按传值规则做默认转换)

并且在 Python 中调用这种 aardio 对象再次返回到 Python 中的 aardio 对象 也会自动调用 py2.export() 转换为代理对象。

更多关于 py2.export 建议大家查看这个库的源代码。

四、使用限制

注意 py2.export 只能在 Python 启动线程中使用, aardio 可以支持真多线程,也提供了 py2.lock 简化了 Python 全局锁操作,支持除 py2.export 以外的接口。 但要注意:py3.export 与 Python 多线程模式不兼容。

在非 Python 主线程下,py3.export 为 null 值, 使用 py2.mainThread 也可以检测是否 Python 主线程, 其实 Python 的多线程有全局锁 —— 无法实现真正的多线程, 所以如果没有特别的原因 Python 就不要搞多线程了,可以省很多事。

Markdown 格式