【问题标题】:How do I override python's "not in" operator如何覆盖python的“不在”运算符
【发布时间】:2019-11-02 22:28:04
【问题描述】:

我意识到__contains__ 是“in”运算符。我也意识到,默认情况下“不在”是__contains__ 的否定。但是,许多 python 文档将“not in”列为与“in”分开的运算符。是__contains____eq____ne__ 有两个运算符,一个通常是另一个的否定?如果是这样,正确的双下划线 __<name>__ 应该使用什么?

def __init__(self):
    self.numbers = [1,2,3,4,54]

def __contains__(self, key):
    return key in self.numbers

【问题讨论】:

    标签: python python-3.x operator-overloading


    【解决方案1】:

    没有单独的“notcontains”钩子。 innot in 不能单独覆盖。

    存在单独的 __eq____ne__ 挂钩,因为 ==!= 可能不会返回布尔值。例如,您不能将 NumPy 数组的 != 实现为 not (x == y)not in 没有这个问题,因为 innot in 都必须返回布尔值。

    如果您查看data model documentation,您会发现它只为innot in 记录了一个__contains__ 挂钩。您还可以查看implementation,其中innot in 调用相同的PySequence_Contains C API 函数,然后not in! 应用于结果:

        case PyCmp_IN:
            res = PySequence_Contains(w, v);
            if (res < 0)
                return NULL;
            break;
        case PyCmp_NOT_IN:
            res = PySequence_Contains(w, v);
            if (res < 0)
                return NULL;
            res = !res;
            break;
    

    【讨论】:

    • 感谢您链接到实现,这再明确不过了!
    最近更新 更多