eval
делает это, чтобы оценить строку как выражение Python.
Вы не хотите называть eval
об объектах, чтобы получить их представление. pdb
/WinPDB
не называет eval
на своих объектах, чтобы получить их представление. Фактически, eval
почти напротивrepr
.
Если вы хотите увидеть результаты foo.__repr__()
, позвоните по телефону repr(foo)
или просто введите foo
на пульте. Ввод любое выражение на консоли приводит его к показу repr(that expression)
.
Конечно, это означает, что если вы наберете eval(foo)
на консоли, то вы увидите repr(eval(foo))
. Но это не имеет никакого отношения к eval
; это то же самое, что и любое другое выражение.
Между тем, в Winpdb console, вы не используете код Python, вы работаете Winpdb код. У Winpdb есть команда с именем eval
, которая похожа на функцию Python eval
, но это не одно и то же.
Как указано в документации, eval foo
эффективно оценивает foo
в вашем сеансе живой debuggee. Обратите внимание, что это фрагмент, который обрабатывается как выражение Python, не строка, содержащая такой фрагмент.
Итак, eval(variable)
в консоли Winpdb аналогичен eval("(variable)")
в интерактивном интерпретаторе. Который почти идентичен только (variable)
в интерактивном интерпретаторе. Что эквивалентно variable
.
Но если вы наберете variable
(или (variable)
или eval("(variable)")
) в интерактивном интерпретаторе, он печатает repr(variable)
, который вызывает ваш метод __repr__
. Почему это не происходит в Winpdb?
Поскольку распечатка repr
любого выражения, которое вы вводите в интерактивном интерпретаторе, является функцией интерактивного интерпретатора, а не языка. Хотя консоль Winpdb может сделать то же самое, это не так.(Это позволяет отлаживать проблемы с помощью методов __repr__
и позволяет избежать запуска кода из debuggee в отладчике, не делая его явным.)
Итак, как насчет eval(variable.__repr__())
. Как вы можете догадаться, это похоже на оценку строки "(variable.__repr__())"
в debuggee. То, что .__repr__()
заканчивается тем, что является частью выражения, которое вы оцениваете в среде debuggee, поэтому, конечно, оно вызывается в среде debuggee. Результатом является не объект UserDict
, как в предыдущей версии, а строка.
Итак, наконец-то, что именно делает Winpdb показать в своей колонке магнезии и, как результат вызова eval
? Ну, это явно не задокументировано, поэтому вы можете понять это через пробную версию и ошибку или прочитать источник.
Что означает 'eval' для оценки строки как кода Python. Это полная противоположность тому, что вы утверждаете, что ищете. Итак ... что заставляет вас думать, что «eval» - это то, что вы хотите в первую очередь? – abarnert
@abarnert Я использовал неправильное слово. Я не обязательно хочу изменить, как это работает. Я хочу знать, что он делает. –
Между тем, 'pdb' не вызывает' eval' на вашем объекте, чтобы получить его представление; он просто называет 'repr'. И я не уверен, почему вы ожидали определить «UserDict .__ repr__», чтобы повлиять на представление некоторых совершенно не связанных между собой классов, которые вы нам не показали, но ... это не так. – abarnert