Не уверенный в терминологии здесь, но это было бы различием между eq?
и equal?
в схеме или различии между ==
и strncmp
со струнами до; где в каждом случае первое возвратило бы false для двух различных строк, которые на самом деле имеют то же содержание, и второе возвратило бы true.
Я ищу последнюю операцию для ASTs Python.
Прямо сейчас я делаю это:
import ast
def AST_eq(a, b):
return ast.dump(a) == ast.dump(b)
который, по-видимому, работает, но чувствует себя подобно неизбежной аварии. Кто-либо знает о лучшем пути?
Править: к сожалению, когда я иду для сравнения этих двух ASTs' __dict__
то сравнение значения по умолчанию к использованию отдельных элементов' __eq__
методы. ASTs реализованы как деревья другого ASTs и их __eq__
по-видимому, проверки на ссылочные идентификационные данные. Так ни один прямо ==
ни решение в работе ссылки Thomas. (Помимо которого, я также не хочу разделять каждый тип узла AST на подклассы для вставки этого пользовательского __eq__
.)
В Python идентичность объекта сравнивается с использованием оператора is
(который, в отличие от ==
, не может быть перегружен). Если не реализовано идиотом, ==
не будет сравнивать идентичность, а скорее равенство (если возможно и реализовано, конечно). А в случае встроенного строкового класса это, конечно, не так.
Однако может быть другая проблема с вашей реализацией - поскольку дамп дает очень точную информацию (подходящую для отладки), два ASST с, например, переменная с другим именем может считаться ! =
. Это может быть то, что вы хотите, а может и не быть.