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

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

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

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

7 голосов | спросил Aivar 13 ThuEurope/Moscow2012-12-13T15:22:29+04:00Europe/Moscow12bEurope/MoscowThu, 13 Dec 2012 15:22:29 +0400 2012, 15:22:29

4 ответа


0

У меня тоже есть идея решения - я мог бы обработать код (или 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 и компиляцией ...

ответил Aivar 21 FriEurope/Moscow2012-12-21T14:05:19+04:00Europe/Moscow12bEurope/MoscowFri, 21 Dec 2012 14:05:19 +0400 2012, 14:05:19
0

Вы пробовали pudb?   http://pypi.python.org/pypi/pudb На уровне Debian:  apt-get установить python-pudb

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

Для обучения студентов вы можете быть чем-то вроде:

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

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

ответил Pierre 21 FriEurope/Moscow2012-12-21T15:22:34+04:00Europe/Moscow12bEurope/MoscowFri, 21 Dec 2012 15:22:34 +0400 2012, 15:22:34
0

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

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

ответил jeffknupp 20 ThuEurope/Moscow2012-12-20T01:38:50+04:00Europe/Moscow12bEurope/MoscowThu, 20 Dec 2012 01:38:50 +0400 2012, 01:38:50
0

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

ответил asdf 20 ThuEurope/Moscow2012-12-20T01:51:20+04:00Europe/Moscow12bEurope/MoscowThu, 20 Dec 2012 01:51:20 +0400 2012, 01:51:20

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132