开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 0

source-code-analysis/python3.8.1

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
python3.8.1
/
Doc
/
c-api
/
structures.rst
python3.8.1
/
Doc
/
c-api
/
structures.rst
structures.rst 14.88 KB
一键复制 编辑 原始数据 按行查看 历史
zhangweibo 提交于 2021年11月16日 09:46 +08:00 . git init

Common Object Structures

There are a large number of structures which are used in the definition of object types for Python. This section describes these structures and how they are used.

All Python objects ultimately share a small number of fields at the beginning of the object's representation in memory. These are represented by the :c:type:`PyObject` and :c:type:`PyVarObject` types, which are defined, in turn, by the expansions of some macros also used, whether directly or indirectly, in the definition of all other Python objects.

.. c:type:: PyObject

 All object types are extensions of this type. This is a type which
 contains the information Python needs to treat a pointer to an object as an
 object. In a normal "release" build, it contains only the object's
 reference count and a pointer to the corresponding type object.
 Nothing is actually declared to be a :c:type:`PyObject`, but every pointer
 to a Python object can be cast to a :c:type:`PyObject*`. Access to the
 members must be done by using the macros :c:macro:`Py_REFCNT` and
 :c:macro:`Py_TYPE`.


.. c:type:: PyVarObject

 This is an extension of :c:type:`PyObject` that adds the :attr:`ob_size`
 field. This is only used for objects that have some notion of *length*.
 This type does not often appear in the Python/C API.
 Access to the members must be done by using the macros
 :c:macro:`Py_REFCNT`, :c:macro:`Py_TYPE`, and :c:macro:`Py_SIZE`.


.. c:macro:: PyObject_HEAD

 This is a macro used when declaring new types which represent objects
 without a varying length. The PyObject_HEAD macro expands to::

 PyObject ob_base;

 See documentation of :c:type:`PyObject` above.


.. c:macro:: PyObject_VAR_HEAD

 This is a macro used when declaring new types which represent objects
 with a length that varies from instance to instance.
 The PyObject_VAR_HEAD macro expands to::

 PyVarObject ob_base;

 See documentation of :c:type:`PyVarObject` above.


.. c:macro:: Py_TYPE(o)

 This macro is used to access the :attr:`ob_type` member of a Python object.
 It expands to::

 (((PyObject*)(o))->ob_type)


.. c:macro:: Py_REFCNT(o)

 This macro is used to access the :attr:`ob_refcnt` member of a Python
 object.
 It expands to::

 (((PyObject*)(o))->ob_refcnt)


.. c:macro:: Py_SIZE(o)

 This macro is used to access the :attr:`ob_size` member of a Python object.
 It expands to::

 (((PyVarObject*)(o))->ob_size)


.. c:macro:: PyObject_HEAD_INIT(type)

 This is a macro which expands to initialization values for a new
 :c:type:`PyObject` type. This macro expands to::

 _PyObject_EXTRA_INIT
 1, type,


.. c:macro:: PyVarObject_HEAD_INIT(type, size)

 This is a macro which expands to initialization values for a new
 :c:type:`PyVarObject` type, including the :attr:`ob_size` field.
 This macro expands to::

 _PyObject_EXTRA_INIT
 1, type, size,


.. c:type:: PyCFunction

 Type of the functions used to implement most Python callables in C.
 Functions of this type take two :c:type:`PyObject\*` parameters and return
 one such value. If the return value is ``NULL``, an exception shall have
 been set. If not ``NULL``, the return value is interpreted as the return
 value of the function as exposed in Python. The function must return a new
 reference.


.. c:type:: PyCFunctionWithKeywords

 Type of the functions used to implement Python callables in C
 with signature :const:`METH_VARARGS | METH_KEYWORDS`.


.. c:type:: _PyCFunctionFast

 Type of the functions used to implement Python callables in C
 with signature :const:`METH_FASTCALL`.


.. c:type:: _PyCFunctionFastWithKeywords

 Type of the functions used to implement Python callables in C
 with signature :const:`METH_FASTCALL | METH_KEYWORDS`.


.. c:type:: PyMethodDef

 Structure used to describe a method of an extension type. This structure has
 four fields:

 +------------------+---------------+-------------------------------+
 | Field | C Type | Meaning |
 +==================+===============+===============================+
 | :attr:`ml_name` | const char \* | name of the method |
 +------------------+---------------+-------------------------------+
 | :attr:`ml_meth` | PyCFunction | pointer to the C |
 | | | implementation |
 +------------------+---------------+-------------------------------+
 | :attr:`ml_flags` | int | flag bits indicating how the |
 | | | call should be constructed |
 +------------------+---------------+-------------------------------+
 | :attr:`ml_doc` | const char \* | points to the contents of the |
 | | | docstring |
 +------------------+---------------+-------------------------------+

The :attr:`ml_meth` is a C function pointer. The functions may be of different types, but they always return :c:type:`PyObject\*`. If the function is not of the :c:type:`PyCFunction`, the compiler will require a cast in the method table. Even though :c:type:`PyCFunction` defines the first parameter as :c:type:`PyObject\*`, it is common that the method implementation uses the specific C type of the self object.

The :attr:`ml_flags` field is a bitfield which can include the following flags. The individual flags indicate either a calling convention or a binding convention.

There are four basic calling conventions for positional arguments and two of them can be combined with :const:`METH_KEYWORDS` to support also keyword arguments. So there are a total of 6 calling conventions:

.. data:: METH_VARARGS

 This is the typical calling convention, where the methods have the type
 :c:type:`PyCFunction`. The function expects two :c:type:`PyObject\*` values.
 The first one is the *self* object for methods; for module functions, it is
 the module object. The second parameter (often called *args*) is a tuple
 object representing all arguments. This parameter is typically processed
 using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`.


.. data:: METH_VARARGS | METH_KEYWORDS

 Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`.
 The function expects three parameters: *self*, *args*, *kwargs* where
 *kwargs* is a dictionary of all the keyword arguments or possibly ``NULL``
 if there are no keyword arguments. The parameters are typically processed
 using :c:func:`PyArg_ParseTupleAndKeywords`.


.. data:: METH_FASTCALL

 Fast calling convention supporting only positional arguments.
 The methods have the type :c:type:`_PyCFunctionFast`.
 The first parameter is *self*, the second parameter is a C array
 of :c:type:`PyObject\*` values indicating the arguments and the third
 parameter is the number of arguments (the length of the array).

 This is not part of the :ref:`limited API <stable>`.

 .. versionadded:: 3.7


.. data:: METH_FASTCALL | METH_KEYWORDS

 Extension of :const:`METH_FASTCALL` supporting also keyword arguments,
 with methods of type :c:type:`_PyCFunctionFastWithKeywords`.
 Keyword arguments are passed the same way as in the vectorcall protocol:
 there is an additional fourth :c:type:`PyObject\*` parameter
 which is a tuple representing the names of the keyword arguments
 or possibly ``NULL`` if there are no keywords. The values of the keyword
 arguments are stored in the *args* array, after the positional arguments.

 This is not part of the :ref:`limited API <stable>`.

 .. versionadded:: 3.7


.. data:: METH_NOARGS

 Methods without parameters don't need to check whether arguments are given if
 they are listed with the :const:`METH_NOARGS` flag. They need to be of type
 :c:type:`PyCFunction`. The first parameter is typically named *self* and will
 hold a reference to the module or object instance. In all cases the second
 parameter will be ``NULL``.


.. data:: METH_O

 Methods with a single object argument can be listed with the :const:`METH_O`
 flag, instead of invoking :c:func:`PyArg_ParseTuple` with a ``"O"`` argument.
 They have the type :c:type:`PyCFunction`, with the *self* parameter, and a
 :c:type:`PyObject\*` parameter representing the single argument.


These two constants are not used to indicate the calling convention but the binding when use with methods of classes. These may not be used for functions defined for modules. At most one of these flags may be set for any given method.

.. data:: METH_CLASS

 .. index:: builtin: classmethod

 The method will be passed the type object as the first parameter rather
 than an instance of the type. This is used to create *class methods*,
 similar to what is created when using the :func:`classmethod` built-in
 function.


.. data:: METH_STATIC

 .. index:: builtin: staticmethod

 The method will be passed ``NULL`` as the first parameter rather than an
 instance of the type. This is used to create *static methods*, similar to
 what is created when using the :func:`staticmethod` built-in function.

One other constant controls whether a method is loaded in place of another definition with the same method name.

.. data:: METH_COEXIST

 The method will be loaded in place of existing definitions. Without
 *METH_COEXIST*, the default is to skip repeated definitions. Since slot
 wrappers are loaded before the method table, the existence of a
 *sq_contains* slot, for example, would generate a wrapped method named
 :meth:`__contains__` and preclude the loading of a corresponding
 PyCFunction with the same name. With the flag defined, the PyCFunction
 will be loaded in place of the wrapper object and will co-exist with the
 slot. This is helpful because calls to PyCFunctions are optimized more
 than wrapper object calls.


.. c:type:: PyMemberDef

 Structure which describes an attribute of a type which corresponds to a C
 struct member. Its fields are:

 +------------------+---------------+-------------------------------+
 | Field | C Type | Meaning |
 +==================+===============+===============================+
 | :attr:`name` | const char \* | name of the member |
 +------------------+---------------+-------------------------------+
 | :attr:`!type` | int | the type of the member in the |
 | | | C struct |
 +------------------+---------------+-------------------------------+
 | :attr:`offset` | Py_ssize_t | the offset in bytes that the |
 | | | member is located on the |
 | | | type's object struct |
 +------------------+---------------+-------------------------------+
 | :attr:`flags` | int | flag bits indicating if the |
 | | | field should be read-only or |
 | | | writable |
 +------------------+---------------+-------------------------------+
 | :attr:`doc` | const char \* | points to the contents of the |
 | | | docstring |
 +------------------+---------------+-------------------------------+

 :attr:`!type` can be one of many ``T_`` macros corresponding to various C
 types. When the member is accessed in Python, it will be converted to the
 equivalent Python type.

 =============== ==================
 Macro name C type
 =============== ==================
 T_SHORT short
 T_INT int
 T_LONG long
 T_FLOAT float
 T_DOUBLE double
 T_STRING const char \*
 T_OBJECT PyObject \*
 T_OBJECT_EX PyObject \*
 T_CHAR char
 T_BYTE char
 T_UBYTE unsigned char
 T_UINT unsigned int
 T_USHORT unsigned short
 T_ULONG unsigned long
 T_BOOL char
 T_LONGLONG long long
 T_ULONGLONG unsigned long long
 T_PYSSIZET Py_ssize_t
 =============== ==================

 :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX` differ in that
 :c:macro:`T_OBJECT` returns ``None`` if the member is ``NULL`` and
 :c:macro:`T_OBJECT_EX` raises an :exc:`AttributeError`. Try to use
 :c:macro:`T_OBJECT_EX` over :c:macro:`T_OBJECT` because :c:macro:`T_OBJECT_EX`
 handles use of the :keyword:`del` statement on that attribute more correctly
 than :c:macro:`T_OBJECT`.

 :attr:`flags` can be ``0`` for write and read access or :c:macro:`READONLY` for
 read-only access. Using :c:macro:`T_STRING` for :attr:`type` implies
 :c:macro:`READONLY`. :c:macro:`T_STRING` data is interpreted as UTF-8.
 Only :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX`
 members can be deleted. (They are set to ``NULL``).


.. c:type:: PyGetSetDef

 Structure to define property-like access for a type. See also description of
 the :c:member:`PyTypeObject.tp_getset` slot.

 +-------------+------------------+-----------------------------------+
 | Field | C Type | Meaning |
 +=============+==================+===================================+
 | name | const char \* | attribute name |
 +-------------+------------------+-----------------------------------+
 | get | getter | C Function to get the attribute |
 +-------------+------------------+-----------------------------------+
 | set | setter | optional C function to set or |
 | | | delete the attribute, if omitted |
 | | | the attribute is readonly |
 +-------------+------------------+-----------------------------------+
 | doc | const char \* | optional docstring |
 +-------------+------------------+-----------------------------------+
 | closure | void \* | optional function pointer, |
 | | | providing additional data for |
 | | | getter and setter |
 +-------------+------------------+-----------------------------------+

 The ``get`` function takes one :c:type:`PyObject\*` parameter (the
 instance) and a function pointer (the associated ``closure``)::

 typedef PyObject *(*getter)(PyObject *, void *);

 It should return a new reference on success or ``NULL`` with a set exception
 on failure.

 ``set`` functions take two :c:type:`PyObject\*` parameters (the instance and
 the value to be set) and a function pointer (the associated ``closure``)::

 typedef int (*setter)(PyObject *, PyObject *, void *);

 In case the attribute should be deleted the second parameter is ``NULL``.
 Should return ``0`` on success or ``-1`` with a set exception on failure.
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/python_sourcecode/python3.8.1.git
git@gitee.com:python_sourcecode/python3.8.1.git
python_sourcecode
python3.8.1
python3.8.1
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /