# py3.object 库模块帮助文档

## py3 成员列表 <a id="py3" href="#py3">&#x23;</a>

### py3.object <a id="py3.object" href="#py3.object">&#x23;</a>
所有Python对象都是一个pyObject  
在aardio中使用py3.object封装该指针为对象,  
并自动管理引用计数

### py3.object() <a id="py3.object" href="#py3.object">&#x23;</a>
[返回对象:py3Object](#py3Object)

### py3.object(aardio值) <a id="py3.object" href="#py3.object">&#x23;</a>
将aardio值转换为pyObject  
py3扩展库负责在与python交互时自动转换能转换的基础数据类型  
其他对象aardio代码接触到的都会是py3.object  
原始pyObject指针原则上保证不会返回给aardio调用代码

### py3.object(pyObject封装对象) <a id="py3.object" href="#py3.object">&#x23;</a>
参数是py3.object封装对象  
复制一个对象，并增加引用计数  
并负责在封装对象销毁时释放一次pyObject引用计数  

这里传入的参数是aardio值，或者是py3.object统一都会返回py3.object  
py3扩展库基于这种兼容性自动转换所有aardio,python对象

### py3.object(pyObject指针,true) <a id="py3.object" href="#py3.object">&#x23;</a>
参数@2为true,参数@1就必须是pyObject对象指针  
返回pyObject封装对象,并负责在封装对象销毁时释放一次pyObject引用计数,  
原始pyObject指针原则上保证不会返回给aardio调用代码  
这种用法仅用于py扩展库内部使用

## py3Object 成员列表 <a id="py3Object" href="#py3Object">&#x23;</a>

### py3Object.* <a id="py3Object.any" href="#py3Object.any">&#x23;</a>
输入 Python 对象属性或函数名称。  
如果首字符为 $ ，则返回支持命名参数的函数对象。  
也就是说 pyObject.$fun 等价于 pyObject.fun.invoke。  

[返回对象:py3Object](#py3Object)

### py3Object.call() <a id="py3Object.call" href="#py3Object.call">&#x23;</a>
[返回对象:py3Object](#py3Object)

### py3Object.call(不定个数参数) <a id="py3Object.call" href="#py3Object.call">&#x23;</a>
该对象为 Python 函数对象时支持使用此方法调用 Python 函数,  
也可以不写 call 函数，直接作为普通函数调用。  
参数为不定个数的字符串、数值、布尔值等。  

如果函数调用成功，  
返回值除数值、布尔值、字符串、字节数组以外的值  
在 aardio 中存为 py.object 对象

### py3Object.callObject( py3.tuple对象 ) <a id="py3Object.callObject" href="#py3Object.callObject">&#x23;</a>
该对象为 Python 函数对象时支持使用此方法调用 Python 函数,  
参数为tuple元数组对象  
返回值为 py3.object对象,可使用 tostring 或 tonumber 等函数转换为aardio类型

### py3Object.callObject() <a id="py3Object.callObject" href="#py3Object.callObject">&#x23;</a>
[返回对象:py3Object](#py3Object)

### py3Object.checkBool() <a id="py3Object.checkBool" href="#py3Object.checkBool">&#x23;</a>
检测是否布尔值

### py3Object.checkBytes() <a id="py3Object.checkBytes" href="#py3Object.checkBytes">&#x23;</a>
检测是否字节串

### py3Object.checkDict() <a id="py3Object.checkDict" href="#py3Object.checkDict">&#x23;</a>
检测是否字典

### py3Object.checkFloat() <a id="py3Object.checkFloat" href="#py3Object.checkFloat">&#x23;</a>
检测是否浮点数

### py3Object.checkList() <a id="py3Object.checkList" href="#py3Object.checkList">&#x23;</a>
检测是否列表

### py3Object.checkLong() <a id="py3Object.checkLong" href="#py3Object.checkLong">&#x23;</a>
检测是否整数

### py3Object.checkNumber() <a id="py3Object.checkNumber" href="#py3Object.checkNumber">&#x23;</a>
检测是否数值

### py3Object.checkTuple() <a id="py3Object.checkTuple" href="#py3Object.checkTuple">&#x23;</a>
检测是否字典

### py3Object.checkUnicode() <a id="py3Object.checkUnicode" href="#py3Object.checkUnicode">&#x23;</a>
检测是否字符串，注意Py3中字符串都是Unicode，取回aardio都是UTF8编码

### py3Object.each() <a id="py3Object.each" href="#py3Object.each">&#x23;</a>

```aardio
for( pyItem in py3Object.each() ){  
	/*创建迭代器用于遍历所有的项,返回一个值*/  
}  

[返回对象:py3Object](#py3Object)
```

### py3Object.getAttr("字符串参数") <a id="py3Object.getAttr" href="#py3Object.getAttr">&#x23;</a>
读属性值，也可以用成员操作符获取。  
除数值、布尔值、字符串、字节数组以外的值在 aardio 中存为 py.object 对象。  
指定可选参数 @2 为 true 则不检查属性是否存在。

### py3Object.getAttr() <a id="py3Object.getAttr" href="#py3Object.getAttr">&#x23;</a>
[返回对象:py3Object](#py3Object)

### py3Object.getFuncDesc <a id="py3Object.getFuncDesc" href="#py3Object.getFuncDesc">&#x23;</a>

```aardio
function(){
	return PyEval_GetFuncDesc(owner.pyObject );	
}
```

### py3Object.getFuncDesc() <a id="py3Object.getFuncDesc" href="#py3Object.getFuncDesc">&#x23;</a>
获取函数原型，返回值为字符串。

### py3Object.getFuncName() <a id="py3Object.getFuncName" href="#py3Object.getFuncName">&#x23;</a>
获取函数名，返回值为字符串。

### py3Object.getFuncName（） <a id="py3Object.getFuncName（）" href="#py3Object.getFuncName（）">&#x23;</a>
获取函数名

### py3Object.getItem(索引) <a id="py3Object.getItem" href="#py3Object.getItem">&#x23;</a>
返回指定索引的项，也可以用索引下标操作符 [] 取值。  
除数值、布尔值、字符串、字节数组以外的值在 aardio 中存为 py.object 对象

### py3Object.getTypeFlags() <a id="py3Object.getTypeFlags" href="#py3Object.getTypeFlags">&#x23;</a>
返回类型特性,用法请参考此函数源码以及 Python 文档

### py3Object.has("字符串参数") <a id="py3Object.has" href="#py3Object.has">&#x23;</a>
是否存在指定的属性

### py3Object.hasFeature() <a id="py3Object.hasFeature" href="#py3Object.hasFeature">&#x23;</a>
检测类型特性,这个函数实现了C++中的PyType_HasFeature宏相同的功能

### py3Object.invoke <a id="py3Object.invoke" href="#py3Object.invoke">&#x23;</a>
该对象为 Python 函数对象时支持使用此方法调用 Python 函数,  
与通过 call 方法调用不同的是 invoke 支持传递命名参数，  
如果函数调用成功，返回值除数值、布尔值、字符串、字节数组以外的值  
在 aardio 中存为 py.object 对象。  

pyObject.func.invoke 可缩写为 pyObject.$func

### py3Object.invoke() <a id="py3Object.invoke" href="#py3Object.invoke">&#x23;</a>
[返回对象:py3Object](#py3Object)

### py3Object.invoke(kwarg=value,arg1...) <a id="py3Object.invoke" href="#py3Object.invoke">&#x23;</a>
如果参数@1是未指定元表的纯表对象,且没有 pyObject 成员，  
则将该表中的名值对作为调用时的命名参数，  
该表中的数组成员作为调用时的匿名参数，  
注意名值对参数应当且只能写在最前面，所有参数请用逗号分隔。  

如果指定了第 2 个参数或更多参数，则 kwarg 的数组成员被忽略。  
如果参数 @1 不符合前述规则，  
则与 call 调用相同的方式将所有参数作为调用时的匿名参数。  

如果参数 @1 为 null，则忽略第一个参数并禁用命名参数。  
并将第二个参数作为第一个参数，后续参数依次前移。

### py3Object.invokeObject <a id="py3Object.invokeObject" href="#py3Object.invokeObject">&#x23;</a>
该对象为 Python 函数对象时支持使用此方法调用 Python 函数,  
与通过 call 方法调用不同的是 invokeObject 支持传递命名参数，  
调用成功返回值为 py3.object 对象。  
invoke 函数调用 invokeObject 函数并会转换基础类型的值为纯 aardio 值。

### py3Object.invokeObject() <a id="py3Object.invokeObject" href="#py3Object.invokeObject">&#x23;</a>
[返回对象:py3Object](#py3Object)

[返回对象:py3Object](#py3Object)

### py3Object.invokeObject(kwarg=value,arg1...) <a id="py3Object.invokeObject" href="#py3Object.invokeObject">&#x23;</a>
如果参数@1是未指定元表的纯表对象,且没有 pyObject 成员，  
则将该表中的名值对作为调用时的命名参数，  
该表中的数组成员作为调用时的匿名参数，  
注意名值对参数应当且只能写在最前面，所有参数请用逗号分隔。  

如果指定了第 2 个参数或更多参数，则 kwarg 的数组成员被忽略。  
如果参数 @1 不符合前述规则，  
则与 call 调用相同的方式将所有参数作为调用时的匿名参数。  

如果参数 @1 为 null，则忽略第一个参数并禁用命名参数。  
并将第二个参数作为第一个参数，后续参数依次前移。

### py3Object.parseValue() <a id="py3Object.parseValue" href="#py3Object.parseValue">&#x23;</a>
检测 Python 对象的类型，并自动返回对应的aardio类型对象。  
基础的数值字符串布尔值转换为同类型，整数值即使大于 53 位仍转为浮点数。  
dict, list, tuple 等等使用json格式转换为 aardio 类型的表

### py3Object.parseValue(true) <a id="py3Object.parseValue" href="#py3Object.parseValue">&#x23;</a>
检测P ython 对象的类型，  
基础类型返回对应的 aardio 类型对象，其他对象返回自身。  
基础类型指：数值、布尔值、字符串、字节数组。  
数值仅转换浮点数值，以及不大于 53位（bit）的整数值。  
字节数组指 Python 中的 bytes，aardio 中的 buffer 对象。  
所有 Python 返回的对象自动调用此函数转换基础类型。

### py3Object.setAttr("字符串参数",) <a id="py3Object.setAttr" href="#py3Object.setAttr">&#x23;</a>
写属性成员的值，也可以用成员操作符赋值。

### py3Object.setItem(索引，) <a id="py3Object.setItem" href="#py3Object.setItem">&#x23;</a>
修改指定索引的项，也可以用索引下标操作符 [] 赋值。

### py3Object.size64() <a id="py3Object.size64" href="#py3Object.size64">&#x23;</a>
获取64位无符号长整数  
返回 math.size64 对象

### py3Object.stealPtr() <a id="py3Object.stealPtr" href="#py3Object.stealPtr">&#x23;</a>
接管此对象的指针并盗用一次引用计数  
原对象的内部指针被清空,并不再负责释放引用计数  
 steal references

### py3Object.toBool() <a id="py3Object.toBool" href="#py3Object.toBool">&#x23;</a>
解析为 aardio 布尔值

### py3Object.toBytes() <a id="py3Object.toBytes" href="#py3Object.toBytes">&#x23;</a>
解析为 aardio 字节数组

### py3Object.toDict() <a id="py3Object.toDict" href="#py3Object.toDict">&#x23;</a>
如果 Python 对象是一个 dict,  
返回绑定相同 Python 对象的 py3.dict 对象,  
添加引用计数,对象销毁时负责释放引用计数,  
否则将传入对象作为 Python 内置函数 dict 的参数并返回 py3.dict 对象,  
失败返回null  

[返回对象:py3DictObject](#py3DictObject)

### py3Object.toList() <a id="py3Object.toList" href="#py3Object.toList">&#x23;</a>
如果 Python 对象是一个 list,  
返回绑定相同 Python 对象的 py3.list 对象,  
添加引用计数,对象销毁时负责释放引用计数,  
否则将传入对象作为 Python 内置函数 list 的参数并返回 py3.list 对象,  
失败返回null  

[返回对象:py3ListObject](#py3ListObject)

### py3Object.toNumber() <a id="py3Object.toNumber" href="#py3Object.toNumber">&#x23;</a>
解析为 aardio 数值  
也可以直接将对象传入 tonumber 函数并转换为数值

### py3Object.toStr() <a id="py3Object.toStr" href="#py3Object.toStr">&#x23;</a>
Python 对象转换为 Python 字符串对象,  
相当于调用 Python 中的 str 函数,  
如果要返回 aardio 字符串可使用 toString 函数,  
也可以调用 py3.str 函数创建 Python 字符串对象

### py3Object.toString() <a id="py3Object.toString" href="#py3Object.toString">&#x23;</a>
Python 对象转换为 aardio 字符串  
Python 字节数组（bytes）解析为aardio中的字节数组（buffer）  
其他类型尝试调用 Python 中的 str 函数转换为 aardio 字符串,  
也可以直接将对象作为参数传入 tostring 函数转换为字符串

### py3Object.toTuple() <a id="py3Object.toTuple" href="#py3Object.toTuple">&#x23;</a>
如果 Python 对象是一个 tuple,  
返回绑定相同 Python 对象的 py3.tuple 对象,  
添加引用计数,对象销毁时负责释放引用计数,  
否则将传入对象作为 Python 内置函数 tuple 的参数并返回 py3.tuple 对象,  
失败返回null  

[返回对象:py3TupleObject](#py3TupleObject)

### py3Object.type() <a id="py3Object.type" href="#py3Object.type">&#x23;</a>
返回类型名字
