IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Cpython学习笔记(2)——富比较 -> 正文阅读

[Python知识库]Cpython学习笔记(2)——富比较

环境

? ? ? ? Windows 10

? ? ? ? Cpython 3.7.12

概述

? ? ? ? Python中的富比较可以比较一个对象的两个不同实例,本片笔记主要讲述了在 object.c 中有关富比较的函数。

do_richcompare

????????_Py_SwappedOp[] 就是定义的操作符集,Py_GT、Py_GE、Py_EQ、Py_NE、Py_LT、?Py_LE分别对应 <、<=、==、!=、>、>= 。

????????richcmpfunc 定义在 object.h ,简单来说就是每个类型都需要实现或者指空的一个指针。

? ? ? ? 第一个判断先判断类型不同的 v 与 w,w 的类型是否为 v 类型的子类型,再判断 w 的类型中是否规定了富比较。若上述判断都为真,则置?checked_reverse_op 为 1 ,然后将新分配的?richcmpfunc(相当于 w.操作符v )分配给对象 res ,如果 res 是已实现的,则函数返回对象 res 并减少 res 引用计数。

? ? ? ? 第二个判断如果 v 的类型规定了富比较,那么将新分配的?richcmpfunc(相当于 v.操作符w )分配给对象 res ,如果 res 是已实现的,则函数返回对象 res 并减少 res 引用计数。

? ? ? ? 第三个判断如果?checked_reverse_op 此时仍为 0 且 w 的类型规定了富比较,则将 w 规定的富比较赋给?richcmpfunc 类型的 f ,再将然后将新分配的?richcmpfunc(相当于 w.操作符v )分配给对象 res ,如果 res 是已实现的,则函数返回对象 res 并减少 res 引用计数。

? ? ? ? 如果上述判断中都未返回值则进行一个 switch 判断,这个判断主要的作用是如果 v 和 w 的类型都未规定富比较,那么至少要给 == 或 != 一个合适的默认值,如果未给出则报错并返回空值,若给出则返回对象 res 并增加 res 引用计数。

int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};

static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="};

static PyObject *
do_richcompare(PyObject *v, PyObject *w, int op)
{
    richcmpfunc f;
    PyObject *res;
    int checked_reverse_op = 0;

    if (v->ob_type != w->ob_type &&
        PyType_IsSubtype(w->ob_type, v->ob_type) &&
        (f = w->ob_type->tp_richcompare) != NULL) {
        checked_reverse_op = 1;
        res = (*f)(w, v, _Py_SwappedOp[op]);
        if (res != Py_NotImplemented)
            return res;
        Py_DECREF(res);
    }
    if ((f = v->ob_type->tp_richcompare) != NULL) {
        res = (*f)(v, w, op);
        if (res != Py_NotImplemented)
            return res;
        Py_DECREF(res);
    }
    if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) {
        res = (*f)(w, v, _Py_SwappedOp[op]);
        if (res != Py_NotImplemented)
            return res;
        Py_DECREF(res);
    }
    switch (op) {
    case Py_EQ:
        res = (v == w) ? Py_True : Py_False;
        break;
    case Py_NE:
        res = (v != w) ? Py_True : Py_False;
        break;
    default:
        PyErr_Format(PyExc_TypeError,
                     "'%s' not supported between instances of '%.100s' and '%.100s'",
                     opstrings[op],
                     v->ob_type->tp_name,
                     w->ob_type->tp_name);
        return NULL;
    }
    Py_INCREF(res);
    return res;
}

?PyObject_RichCompare

? ? ? ? 这个函数就是进行进一步的判断与断言,再调用?do_richcompare 函数。先来一个断言,若操作符 op 不在规定的操作符集中则终止程序,然后判断 v 和 w 有没有为空的,有则报错并返回空值,接着再判断是否正在进行 v 与 w 的富比较,是则返回空值。经过上述操作,再调用?do_richcompare 函数并将其返回值赋给对象 res,然后返回 res( Py_LeaveRecursiveCall 是用来结束 Py_EnterRecursiveCall 异常处理的)

PyObject *
PyObject_RichCompare(PyObject *v, PyObject *w, int op)
{
    PyObject *res;

    assert(Py_LT <= op && op <= Py_GE);
    if (v == NULL || w == NULL) {
        if (!PyErr_Occurred())
            PyErr_BadInternalCall();
        return NULL;
    }
    if (Py_EnterRecursiveCall(" in comparison"))
        return NULL;
    res = do_richcompare(v, w, op);
    Py_LeaveRecursiveCall();
    return res;
}

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:46:15  更:2021-12-13 12:47:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:46:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码