Как переопределить оператор "не в" Python - PullRequest
2 голосов
/ 03 ноября 2019

Я понимаю, что __contains__ является оператором "in". Я также понимаю, что по умолчанию «не в» это отрицание __contains__. Тем не менее, во многих документах Python списки «не в», как будто это отдельный оператор от «в»Является ли __contains__ как __eq__ и __ne__, где есть два оператора, один обычно отрицание другого? если да, то какой правильный знак подчеркивания __<name>__ следует использовать?

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

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

1 Ответ

4 голосов
/ 03 ноября 2019

Нет отдельного крючка "notcontains". in и not in нельзя переопределить отдельно.

Существуют отдельные хуки __eq__ и __ne__, поскольку == и != могут не возвращать логические значения. Например, вы не можете реализовать != для массивов NumPy как not (x == y). У not in такой проблемы нет, потому что и in, и not in должны возвращать логические значения.

Если вы посмотрите документацию для модели данных , вы увидите, что онадокументирует только один __contains__ хук для in и not in. Вы также можете взглянуть на реализацию , в которой in и not in вызывают одну и ту же функцию API PySequence_Contains C, а затем 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;
...