Следует ли мне проверять идентичность объекта в функции eq

При реализации функции __eq__ мне было интересно, должна ли проверка личности с использованием ключевого слова is быть частью теста? Проверка на равенство для 2 разных переменных может немедленно оценить True функцией is, когда переменные указывают на один и тот же экземпляр объекта. Если переменные указывают на разные экземпляры, конечно, необходимо дальнейшее тестирование. Допустим, у нас есть S = U, тогда, очевидно, мы хотим, чтобы S == U возвращал True, и тестирование на идентичность ускорит это.

def __eq__(self, other):
    if self is other:
        return True
    else:
        pass # do another user defined test for equality 

Я бы сказал, что нет, если только ваш __eq__ по какой-то причине не стоит дорого. Если, например, вы просто проверите, равны ли некоторые члены, даже если они «сложные» (например, строки или списки), внутренняя реализация Python обязательно выполнит проверку. Примером, где я, вероятно, это сделал бы, является древовидная структура данных.

jdehesa 22.03.2018 14:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
120
1

Ответы 1

Вы можете реализовать это, хотя для большинства случаев это, скорее всего, будет небольшой микрооптимизацией. Эта идея оптимизации была применена разработчиками ядра Python для реализации оператора in для list; код - C (в CPython), но эквивалентная логика Python будет:

any(element is target or element == target for element in lst)

Однако имейте в виду, что это может быть не совсем то, что вам нужно, например, numpy.NAN is numpy.NAN - это True, а numpy.NAN == numpy.NAN - это False. Однако это необычный случай.

Также верно для nan = float('nan'): nan == nan → False и nan is nan → True.

BlackJack 22.03.2018 17:38

Другие вопросы по теме