Object Protocol

  • int PyObject_Print(PyObject *o ,FILE fp *,int * flags *)

    • 在文件* fp 上打印对象 o *。错误返回-1。 flags 参数用于启用某些打印选项。当前支持的唯一选项是Py_PRINT_RAW;如果给出,则写入对象的str()而不是repr()
  • int PyObject_HasAttr(PyObject *o PyObject attr_name *)

    • 如果* o 具有属性 attr_name *,则返回1,否则返回0。这等效于 Python 表达式hasattr(o, attr_name)。此Function始终成功。
  • int PyObject_HasAttrString(PyObject *o ,const char attr_name *)

    • 如果* o 具有属性 attr_name *,则返回1,否则返回0。这等效于 Python 表达式hasattr(o, attr_name)。此Function始终成功。
  • PyObject * PyObject_GetAttr(PyObject *o PyObject attr_name *)

    • 返回值:新参考.

从对象* o 检索名为 attr_name 的属性。成功返回属性值,失败则返回 NULL *。这等效于 Python 表达式o.attr_name

  • PyObject * PyObject_GetAttrString(PyObject *o ,const char attr_name *)
    • 返回值:新参考.

从对象* o 检索名为 attr_name 的属性。成功返回属性值,失败则返回 NULL *。这等效于 Python 表达式o.attr_name

  • PyObject * PyObject_GenericGetAttr(PyObject *o PyObject name *)

    • 通用属性获取器函数,应将其放入类型对象的tp_getattro插槽中。它在对象的 MRO 中的类字典中查找 Descriptors,并在对象的dict(如果存在)中查找属性。如Implementing Descriptors所述,数据 Descriptors 优先于实例属性,而非数据 Descriptors 则不然。否则,将引发AttributeError
  • int PyObject_SetAttr(PyObject *o PyObject attr_name *,PyObject ** v *)

    • 将对象* o 的名为 attr_name 的属性的值设置为 v *的值。引发异常并在失败时返回-1;成功返回0。这等效于 Python 语句o.attr_name = v

如果* v NULL *,则会删除该属性,但是不建议使用此Function,而推荐使用PyObject_DelAttr()

  • int PyObject_SetAttrString(PyObject *o ,const char attr_name *,PyObject ** v *)
    • 将对象* o 的名为 attr_name 的属性的值设置为 v *的值。引发异常并在失败时返回-1;成功返回0。这等效于 Python 语句o.attr_name = v

如果* v NULL *,则会删除该属性,但是不建议使用此Function,而推荐使用PyObject_DelAttrString()

  • int PyObject_GenericSetAttr(PyObject *o PyObject name *,PyObject ** value *)

    • 通用属性设置器和删除器函数,旨在将其放入类型对象的tp_setattro插槽中。它在对象的 MRO 中的类的词典中查找数据 Descriptors,如果找到该 Descriptors,则优先于设置或删除实例词典中的属性。否则,将在对象的dict(如果存在)中设置或删除该属性。成功时,将返回0,否则将引发AttributeError并返回-1
  • int PyObject_DelAttr(PyObject *o PyObject attr_name *)

    • 删除对象* o 的名为 attr_name *的属性。失败时返回-1。这等效于 Python 语句del o.attr_name
  • int PyObject_DelAttrString(PyObject *o ,const char attr_name *)

    • 删除对象* o 的名为 attr_name *的属性。失败时返回-1。这等效于 Python 语句del o.attr_name
  • PyObject * PyObject_RichCompare(PyObject *o1 PyObject o2 *,int * opid *)

    • 返回值:新参考.

使用* opid 指定的操作比较 o1 o2 的值,该操作必须是Py_LTPy_LEPy_EQPy_NEPy_GTPy_GE之一,与<<===!=>对应或>=。这等效于 Python 表达式o1 op o2,其中op是与 opid 对应的运算符。如果成功,则返回比较的值;如果失败,则返回 NULL *。

  • int PyObject_RichCompareBool(PyObject *o1 PyObject o2 *,int * opid *)
    • 使用* opid 指定的操作比较 o1 o2 的值,该操作必须是Py_LTPy_LEPy_EQPy_NEPy_GTPy_GE之一,与<<===!=>对应或>=。错误时返回-1,如果结果为假,则返回0,否则返回1。这等效于 Python 表达式o1 op o2,其中op是与 opid *对应的运算符。

Note

如果* o1 o2 *是同Pair象,则PyObject_RichCompareBool()将始终为Py_EQ返回1,对于Py_NE返回0

  • int PyObject_Cmp(PyObject *o1 PyObject o2 *,int ** result *)
    • 使用* o1 提供的例程(如果存在)比较 o1 o2 的值,否则使用 o2 提供的例程进行比较。比较结果以 result *返回。失败时返回-1。这等效于 Python 语句result = cmp(o1, o2)
  • 整数PyObject_Compare(PyObject *o1 PyObject o2 *)
    • 使用* o1 提供的例程(如果存在)比较 o1 o2 的值,否则使用 o2 *提供的例程进行比较。返回比较成功的结果。错误时,返回的值不确定。使用PyErr_Occurred()来检测错误。这等效于 Python 表达式cmp(o1, o2)

计算对象* o 的字符串表示形式。如果成功,则返回字符串表示形式;如果失败,则返回 NULL *。这等效于 Python 表达式repr(o)。由repr()内置函数和反引号调用。

计算对象* o 的字符串表示形式。如果成功,则返回字符串表示形式;如果失败,则返回 NULL *。这等效于 Python 表达式str(o)。由str()内置函数和print语句调用。

计算对象* o 的 Unicode 字符串表示形式。成功返回 Unicode 字符串表示,失败返回 NULL *。这等效于 Python 表达式unicode(o)。由unicode()内置函数调用。

  • int PyObject_IsInstance(PyObject *inst PyObject cls *)
    • 如果* inst 是类 cls cls 的子类的实例,则返回1;否则返回0。出错时,返回-1并设置异常。如果 cls 是类型对象而不是类对象,则如果 inst cls 类型,则PyObject_IsInstance()返回1。如果 cls 是一个 Tuples,将对 cls 中的每个条目进行检查。当至少一项检查返回1时,结果将为1,否则为0。如果 inst 不是类实例,并且 cls 既不是类型对象,类对象也不是 Tuples,则 inst 必须具有class属性-该属性值与 cls *的类关系将用于确定此Function的结果。

2.1 版中的新Function。

在版本 2.2 中进行了更改:添加了第二个参数,支持 Tuples。

子类确定是pass一种相当直接的方式完成的,但它包括皱纹,扩展类的实现者可能希望意识到。如果AB是类对象,则BA的子类,如果它直接或间接地从A继承。如果其中一个不是类对象,则使用更通用的机制来确定两个对象的类关系。测试* B 是否为 A 的子类时,如果 A B ,则PyObject_IsSubclass()返回 true。如果 A B 是不同的对象,则以深度优先的方式为 A 搜索 B *的bases属性-认为bases属性足以进行此确定。

  • int PyObject_IsSubclass(PyObject 派生PyObject* cls *)
    • 如果类* derived 与类 cls 相同或从类 cls 派生,则返回1,否则返回0。发生错误时,返回-1。如果 cls 是一个 Tuples,将对 cls 中的每个条目进行检查。当至少一项检查返回1时结果为1,否则为0。如果 derived cls *不是实际的类对象(或 Tuples),则此函数使用上述通用算法。

2.1 版中的新Function。

在版本 2.3 中进行了更改:较旧的 Python 版本不支持将 Tuples 作为第二个参数。

  • int PyCallable_Check(PyObject ** o *)

    • 确定对象* o *是否可调用。如果对象可调用,则返回1,否则返回0。此Function始终成功。
  • PyObject * PyObject_Call(PyObject *callable_object PyObject args *,PyObject ** kw *)

    • 返回值:新参考.

调用可调用的 Python 对象* callable_object ,其参数由 Tuples args 给出,命名参数由字典 kw 给出。如果不需要命名参数,则 kw 可以为 NULL *。 * args 不能为 NULL ,如果不需要参数,请使用一个空的 Tuples。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式apply(callable_object, args, kw)callable_object(*args, **kw)

2.2 版中的新Function。

用 Tuples* args 给出的参数调用可调用的 Python 对象 callable_object 。如果不需要参数,则 args 可以为 NULL 。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式apply(callable_object, args)callable_object(*args)

  • PyObject * PyObject_CallFunction(PyObject *callable ,char format *,...)
    • 返回值:新参考.

使用可变数量的 C 参数调用可调用的 Python 对象* callable 。使用Py_BuildValue()样式格式字符串描述 C 参数。格式可以为 NULL ,表示未提供任何参数。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式apply(callable, args)callable(*args)。请注意,如果仅传递PyObject * args,则PyObject_CallFunctionObjArgs()是更快的选择。

  • PyObject * PyObject_CallMethod(PyObject *o ,char method *,char ** format *,...)
    • 返回值:新参考.

用可变数量的 C 参数调用对象* o 的名为 method 的方法。 C 参数由Py_BuildValue()格式的字符串描述,该字符串应产生一个 Tuples。格式可以为 NULL ,表示未提供任何参数。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式o.method(args)。请注意,如果仅传递PyObject * args,则PyObject_CallMethodObjArgs()是更快的选择。

  • PyObject * PyObject_CallFunctionObjArgs(PyObject ** callable *,...,NULL)
    • 返回值:新参考.

调用可变数量的PyObject*参数的可调用 Python 对象* callable 。提供的参数是可变数量的参数,后跟 NULL 。如果成功,则返回调用结果;如果失败,则返回 NULL *。

2.2 版中的新Function。

调用对象* o 的方法,该方法的名称在 name 中作为 Python 字符串对象给出。使用可变数量的PyObject*参数来调用它。提供的参数是可变数量的参数,后跟 NULL 。如果成功,则返回调用结果;如果失败,则返回 NULL *。

2.2 版中的新Function。

  • PyObject_Hash(PyObject ** o *)
    • 计算并返回对象* o *的哈希值。失败时,返回-1。这等效于 Python 表达式hash(o)
  • PyObject_HashNotImplemented(PyObject ** o *)
    • 设置一个TypeError表示type(o)不可哈希,并返回-1。当此函数存储在tp_hash插槽中时,将得到特殊处理,从而允许类型向解释器明确指示其不可哈希。

2.6 版的新Function。

  • int PyObject_IsTrue(PyObject ** o *)

    • 如果对象* o *被认为是 true,则返回1,否则返回0。这等效于 Python 表达式not not o。失败时,返回-1
  • int PyObject_Not(PyObject ** o *)

    • 如果对象* o *被认为是 true,则返回0,否则返回1。这等效于 Python 表达式not o。失败时,返回-1
  • PyObject * PyObject_Type(PyObject ** o *)

    • 返回值:新参考.

当* o 为非 NULL 时,返回与对象 o 的对象类型相对应的类型对象。失败时,引发SystemError并返回 NULL *。这等效于 Python 表达式type(o)。此函数增加返回值的参考计数。确实没有理由使用该函数代替通用表达式o->ob_type,该表达式返回类型为PyTypeObject*的指针,除非需要增加引用计数。

  • int PyObject_TypeCheck(PyObject *o PyTypeObject type *)
    • 如果对象* o type 类型或 type 的子类型,则返回 true。这两个参数都必须不是 NULL *。

2.2 版中的新Function。

  • Py_ssize_t PyObject_Length(PyObject ** o *)
  • Py_ssize_t PyObject_Size(PyObject ** o *)
    • 返回对象的长度* o 。如果对象 o *提供序列和 Map 协议,则返回序列长度。错误时,返回-1。这等效于 Python 表达式len(o)

在版本 2.5 中进行了更改:这些函数返回了int类型。这可能需要更改您的代码以正确支持 64 位系统。

返回* o 的元素,失败时对应于对象 key NULL *。这等效于 Python 表达式o[key]

  • int PyObject_SetItem(PyObject *o PyObject key *,PyObject ** v *)

    • 将对象* key Map 到值 v *。引发异常并在失败时返回-1;成功返回0。这等效于 Python 语句o[key] = v
  • int PyObject_DelItem(PyObject *o PyObject key *)

    • 从* o 删除 key *的 Map。失败时返回-1。这等效于 Python 语句del o[key]
  • int PyObject_AsFileDescriptor(PyObject ** o *)

    • 从 Python 对象派生文件 Descriptors。如果对象是整数或长整数,则返回其值。如果不存在,则调用该对象的fileno()方法(如果存在);否则,将调用该对象的fileno()方法。该方法必须返回一个整数或长整数,将其作为文件 Descriptors 值返回。失败时返回-1
  • PyObject * PyObject_Dir(PyObject ** o *)

    • 返回值:新参考.

这等效于 Python 表达式dir(o),返回适合于对象参数的字符串列表(可能为空),如果有错误,则返回* NULL 。如果参数为 NULL ,则类似于 Python dir(),返回当前本地名称。在这种情况下,如果没有执行框架处于活动状态,则返回 NULL *,但是PyErr_Occurred()将返回 false。

这等效于 Python 表达式iter(o)。它为对象参数返回一个新的迭代器,如果对象已经是一个迭代器,则返回对象本身。如果不能迭代该对象,则引发TypeError并返回* NULL *。