изящный способ протестировать Python ASTs на равенство (не ссылочные или объектные идентификационные данные)

Не уверенный в терминологии здесь, но это было бы различием между 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__.)

8
задан Wang 22 July 2010 в 20:25
поделиться

1 ответ

В Python идентичность объекта сравнивается с использованием оператора is (который, в отличие от == , не может быть перегружен). Если не реализовано идиотом, == не будет сравнивать идентичность, а скорее равенство (если возможно и реализовано, конечно). А в случае встроенного строкового класса это, конечно, не так.

Однако может быть другая проблема с вашей реализацией - поскольку дамп дает очень точную информацию (подходящую для отладки), два ASST с, например, переменная с другим именем может считаться ! = . Это может быть то, что вы хотите, а может и не быть.

1
ответ дан 5 December 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: