Object Protocol¶
-
Py_RETURN_NOTIMPLEMENTED
¶ 正确处理从C函数内返回
Py_NotImplemented
(即增加NotImplemented的引用计数并返回)。
- int
PyObject_Print
(PyObject *o, FILE *fp, int flags)¶ 打印对象o,文件fp。在错误时返回
-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)
。此函数总是成功。
- int
PyObject_HasAttrString
(PyObject *o, const char *attr_name)¶ 如果o具有属性attr_name,则返回
1
,否则返回0
。这等同于Python表达式hasattr(o, attr_name)
。此函数总是成功。
- 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)¶ 通用属性getter函数,用于放入类型对象的
tp_getattro
槽。它在对象的MRO中的类的字典中查找描述器,以及在对象的__dict__
(如果存在)中的属性。如Implementing 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,那么将删除该属性,但是此功能已弃用,有利于使用
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,那么将删除该属性,但是此功能已被弃用,以支持使用
PyObject_DelAttrString()
。
- int
PyObject_GenericSetAttr
(PyObject *o, PyObject *name, PyObject *value)¶ 通用属性设置器和删除器函数,用于放入类型对象的
tp_setattro
插槽。它在对象的MRO中的类的字典中查找数据描述器,如果发现它优先于设置或删除实例字典中的属性。否则,在对象的__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_GenericGetDict
(PyObject *o, void *context)¶ 一个
__dict__
描述器的getter的通用实现。如果需要,它创建字典。版本3.3中的新功能。
- int
PyObject_GenericSetDict
(PyObject *o, void *context)¶ 一个
__dict__
描述器的设置器的通用实现。此实现不允许删除字典。版本3.3中的新功能。
- PyObject*
PyObject_RichCompare
(PyObject *o1, PyObject *o2, int opid)¶ - 返回值:新引用。
Compare the values of o1 and o2 using the operation specified by opid, which must be one of
Py_LT
,Py_LE
,Py_EQ
,Py_NE
,Py_GT
, orPy_GE
, corresponding to<
,<=
,==
,!=
,>
, or>=
respectively. 这等效于Python表达式o1 op o2
,其中op
对应于opid的操作符号。返回成功时的比较值,或失败时返回NULL。
- int
PyObject_RichCompareBool
(PyObject *o1, PyObject *o2, int opid)¶ Compare the values of o1 and o2 using the operation specified by opid, which must be one of
Py_LT
,Py_LE
,Py_EQ
,Py_NE
,Py_GT
, orPy_GE
, corresponding to<
,<=
,==
,!=
,>
, or>=
respectively. 在错误时返回-1
,如果结果为假则返回0
,否则返回1
。这等效于Python表达式o1 op o2
,其中op
对应于opid的操作符号。
注意
If o1 and o2 are the same object, PyObject_RichCompareBool()
will always return 1
for Py_EQ
and 0
for Py_NE
.
- PyObject*
PyObject_Repr
(PyObject *o)¶ - 返回值:新引用。
计算对象o的字符串表示。在失败时返回成功时的字符串表示,NULL。这相当于Python表达式
repr(o)
。由repr()
内建函数调用。在版本3.4中更改:此函数现在包括调试断言,以帮助确保它不会静默丢弃活动异常。
- PyObject*
PyObject_ASCII
(PyObject *o)¶ 作为
PyObject_Repr()
,计算对象o的字符串表示,但转义PyObject_Repr()
返回的字符串中的非ASCII字符\x
,\u
或\U
转义。这将生成一个类似于Python 2中PyObject_Repr()
返回的字符串。由ascii()
内建函数调用。
- PyObject*
PyObject_Str
(PyObject *o)¶ - 返回值:新引用。
计算对象o的字符串表示。在失败时返回成功时的字符串表示,NULL。这相当于Python表达式
str(o)
。由str()
内建函数调用,因此由print()
函数调用。在版本3.4中更改:此函数现在包括调试断言,以帮助确保它不会静默丢弃活动异常。
- PyObject*
PyObject_Bytes
(PyObject *o)¶ 计算对象o的字节表示。 NULL在失败时返回,字节对象成功。这等效于Python表达式
bytes(o)
,当o不是整数时。与bytes(o)
不同,当o是整数而不是零初始化的字节对象时,会引发TypeError。
- int
PyObject_IsSubclass
(PyObject *derived, PyObject *cls)¶ 如果类派生与类cls相同或派生,则返回
1
,否则返回0
。如果出现错误,请返回-1
。如果cls是元组,则将对cls中的每个条目进行检查。当至少一个检查返回
1
时,结果为1
,否则为0
。如果cls有
__subclasscheck__()
方法,则将调用它以确定子类状态,如 PEP 3119否则,如果它是直接或间接子类,则派生是cls的子类,即包含在cls.__mro__
中。通常只有类对象,即
type
或派生类的实例被视为类。但是,对象可以通过具有__bases__
属性(它必须是基类的元组)来覆盖此属性。
- int
PyObject_IsInstance
(PyObject *inst, PyObject *cls)¶ Return
1
if inst is an instance of the class cls or a subclass of cls, or0
if not. 出错时,返回-1
并设置异常。如果cls是元组,则将对cls中的每个条目进行检查。当至少一个检查返回
1
时,结果为1
,否则为0
。如果cls有
__instancecheck__()
方法,则将调用它以确定子类状态,如 PEP 3119否则,inst是cls的实例,如果它的类是cls的子类。实例inst可以通过使用
__class__
属性来覆盖被认为是其类的内容。对象cls可以通过拥有
__bases__
属性(必须是基类的元组)来覆盖它是否被认为是一个类及其基类。
- PyObject*
PyObject_Call
(PyObject *callable_object, PyObject *args, PyObject *kw)¶ - 返回值:新引用。
调用一个可调用的Python对象callable_object,使用元组args给出的参数,以及字典kw给出的命名参数。如果不需要命名参数,则kw可以是NULL。args不能为NULL,如果不需要参数,请使用空元组。返回成功时调用的结果,或失败时返回NULL。这等同于Python表达式
callable_object(* args, ** kw)
。
- PyObject*
PyObject_CallObject
(PyObject *callable_object, PyObject *args)¶ - 返回值:新引用。
调用可调用的Python对象callable_object,其中参数由元组args给出。如果不需要参数,则args可以是NULL。返回成功时调用的结果,或失败时返回NULL。这相当于Python表达式
callable_object(*args)
。
- PyObject*
PyObject_CallFunction
(PyObject *callable, const char *format, ...)¶ - 返回值:新引用。
调用可调用的Python对象可调用,具有可变数量的C参数。C参数使用
Py_BuildValue()
样式格式字符串描述。格式可以是NULL,表示没有提供参数。返回成功时调用的结果,或失败时返回NULL。这相当于Python表达式callable(*args)
。请注意,如果您只传递PyObject *
参数,PyObject_CallFunctionObjArgs()
在版本3.4中更改: 格式的类型已从
char *
更改。
- PyObject*
PyObject_CallMethod
(PyObject *o, const char *method, const char *format, ...)¶ - 返回值:新引用。
使用可变数量的C参数调用对象o的名为方法的方法。C参数由
Py_BuildValue()
格式字符串描述,应该产生一个元组。格式可以是NULL,表示没有提供参数。返回成功时调用的结果,或失败时返回NULL。这相当于Python表达式o.method(args)
。请注意,如果您只传递PyObject *
参数,PyObject_CallMethodObjArgs()
在版本3.4中更改: 方法和格式的类型从
char
。
- PyObject*
PyObject_CallFunctionObjArgs
(PyObject *callable, ..., NULL)¶ - 返回值:新引用。
调用可调用的Python对象可调用,变量编号为
PyObject*
参数。参数以可变数目的参数形式提供,后面跟NULL。返回成功时调用的结果,或失败时返回NULL。
- PyObject*
PyObject_CallMethodObjArgs
(PyObject *o, PyObject *name, ..., NULL)¶ - 返回值:新引用。
调用对象o的方法,其中方法的名称作为名称中的Python字符串对象给出。它使用可变数目的
PyObject*
参数调用。参数以可变数目的参数形式提供,后面跟NULL。返回成功时调用的结果,或失败时返回NULL。
- Py_hash_t
PyObject_Hash
(PyObject *o)¶ 计算并返回对象o的哈希值。失败时,返回
-1
。这相当于Python表达式hash(o)
。在版本3.2中更改:返回类型现在为Py_hash_t。这是一个与Py_ssize_t大小相同的有符号整数。
- Py_hash_t
PyObject_HashNotImplemented
(PyObject *o)¶ 设置
TypeError
,指示type(o)
不可散列,并返回-1
。此函数在存储在tp_hash
插槽中时会收到特殊处理,允许类型向解释器显式指示其不可哈希。
- 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的类型为类型或子类型类型,则返回true。这两个参数必须为非NULL。
- Py_ssize_t
PyObject_Length
(PyObject *o)¶ - Py_ssize_t
PyObject_Size
(PyObject *o)¶ 返回对象o的长度。如果对象o提供序列和映射协议,则返回序列长度。出错时,返回
-1
。这相当于Python表达式len(o)
。
- Py_ssize_t
PyObject_LengthHint
(PyObject *o, Py_ssize_t default)¶ 返回对象o的估计长度。首先尝试返回其实际长度,然后使用
__length_hint__()
进行估计,最后返回默认值。出错时返回-1
。这相当于Python表达式operator.length_hint(o, 默认值)
。版本3.4中的新功能。
- PyObject*
PyObject_GetItem
(PyObject *o, PyObject *key)¶ - 返回值:新引用。
在失败时返回与对象键或NULL对应的o的元素。这等效于Python表达式
o[key]
。
- int
PyObject_SetItem
(PyObject *o, PyObject *key, PyObject *v)¶ 将对象键映射到值v。引发异常并在故障时返回
-1
;成功返回0
。这等效于Python语句o [key] = v
。
- PyObject*
PyObject_Dir
(PyObject *o)¶ - 返回值:新引用。
这等效于Python表达式
dir(o)
,返回适用于对象参数的字符串列表(可能为空),如果存在错误,则返回NULL。如果参数是NULL,这就像Pythondir()
,返回当前局部变量的名称;在这种情况下,如果没有执行帧是活动的,则返回NULL,但PyErr_Occurred()
将返回false。