Как пройти процесс оценки выражения Python?

Я хочу создать визуальный отладчик, который поможет программистам увидеть, как происходит оценка выражений (как подвыражения оцениваются и "заменяются" их значениями, что-то вроде визуализатора оценки выражений в Excel).

Похоже, вы не можете пройти через этот процесс с помощью pdb Python, так как его тончайшая гранулярность - это строка кода. Возможно ли как-то пройти через байт-код Python? Любые другие идеи, как достичь этой цели?

РЕДАКТИРОВАТЬ: Мне нужно легкое решение, которое может быть построено поверх стандартной библиотеки CPython.

4 ответа

Решение

У меня тоже есть идея решения - я мог бы обработать код (или AST), обернув все (под) выражения в фиктивный вызов метода, который не делает ничего, кроме возврата его аргумента. Например.

x = f(sin(x + y))

становится

x = dummy(f(dummy(sin(dummy(dummy(x) + dummy(y))))))

Таким образом, я гарантированно получаю уведомление после оценки каждого подвыражения, а также получаю значения. Я также могу добавить дополнительную информацию о местоположении /AST о том, какая часть выражения в настоящее время обрабатывается, например:

... dummy(x, line=23, col=13, length=1) ...

К сожалению это требует возиться с AST и компиляцией...

Вы пробовали пудб? http://pypi.python.org/pypi/pudb По аналогии с Debian: apt-get install python-pudb

Он прикреплен к pdb, так что я думаю, это не то, что вы ищете. По крайней мере, когда вы входите в функцию, становится ясно, в какой вы находитесь.

Для обучения студентов, то, что вы могли бы быть:

  • во-первых, написать программу с использованием переменных, составляя в несколько этапов,
  • отлаживать эту программу с помощью любого приличного отладчика Python (pdb, winpdb, pudb ...),
  • затем, когда процесс станет понятен, избавьтесь от временных переменных, постепенно объединяя код в меньшее количество строк, пока не дойдете до окончательного кода.

Я знаю, это далеко не идеально, но это лучшее, что я могу себе представить, на данный момент.

Используя pdb, можно вызвать любой вызов функции. Для любого другого оператора pdb может напечатать значения соответствующих имен в строке. Какие дополнительные функции вы ищете, которые не покрыты?

Если вы пытаетесь "шагнуть" в такие вещи, как понимание списка, это не сработает с точки зрения чистого Python, потому что это один код операции. В какой-то момент для каждого выражения вам нужно будет сказать своим ученикам: "Вот где Python входит в реализацию C и оценивает это...".

Вы должны проверить реинтеграцию, это довольно просто, и вы могли бы внести свой вклад в это

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