特殊函数

序列协议

对序列协议的支持是通过添加具有特殊名称的函数来实现的,这是使用add-function标签完成的。

特殊函数名称有:

函数名称

参数

返回类型

CPython 等效

__len__

PyObject* self

Py_ssize_t

PySequence_Size

__getitem__

PyObject* self, Py_ssize_t _i

PyObject*

PySequence_GetItem

__setitem__

PyObject* self, Py_ssize_t _i, PyObject* _value

int

PySequence_SetItem

__contains__

PyObject* self, PyObject* _value

int

PySequence_Contains

__concat__

PyObject* self, PyObject* _other

PyObject*

PySequence_Concat

你只需要将函数名称告知add-function标签,不需要提供任何参数或返回类型信息,当你这样做时,Qt for Python 将创建一个带有参数和返回类型的 C 函数,这些参数和返回类型由上表定义。

该函数需要遵循与CPython等效函数相同的语义,唯一的方法是使用inject-code标签。

一个具体的例子,如何为一个类添加序列协议支持,可以在shiboken测试中找到,更准确地说,是在tests/samplebinding/typesystem_sample.xml中Str类的定义中。

布尔转换

实现布尔类型转换使得可以在布尔表达式中使用具有有效性概念的值。在C++中,这通常通过operator bool() const来实现。在Qt中,相关类有一个bool isNull() const函数。

在Python中,函数__bool__用于此目的。shiboken可以根据命令行选项生成这些函数 –use-operator-bool-as-nb-bool–use-isnull-as-nb-bool, 这些选项可以通过在typesystem XML中的value-typeobject-type元素上指定布尔属性 isNulloperator-bool来覆盖。