При запуске кода с консоли я бы хотел, чтобы и команда, и ее вывод были напечатаны, и мне было интересно, есть ли способ избежать ввода выражения дважды.
Вместо:
print("max(3,4): ", max(3,4))
Мне нужна функция:
f = def(x):
print(.....)
где f(max(3,4))
выводит результат "Вместо":
f(max(3,4))
>>max(3,4): 4
Это вообще возможно?
Думаю нужен eval()
:
def f(expr:str):
print("{}: {}".format(expr, eval(expr))
f("3 + 4 + max(2, 5)")
Выход:
3 + 4 + max(2, 5): 12
Я не знал функции eval, которая может быть удобна для запуска кучи команд из фрейма данных или чего-то еще. Спасибо!
Ради интереса установите библиотеку astor
и:
import ast
import inspect
import astor
def printexpr(x):
cc = inspect.stack(1)[1].code_context[0].strip()
tree = ast.parse(cc)
for node in ast.walk(tree):
if isinstance(node, ast.Call):
if node.func.id == 'printexpr':
out = astor.to_source(node.args[0]).strip().strip('()')
print(f'printexpr({out}): {x}')
return
И сейчас:
>>> printexpr(2)
printexpr(2): 2
>>> printexpr(2 + 3)
printexpr(2 + 3): 5
>>> printexpr(math.pi)
printexpr(math.pi): 3.141592653589793
>>> if True:
... printexpr(2)
>>> printexpr(2), printexpr(4)
printexpr(2): 2
printexpr(2): 4
>>> spam = printexpr
>>> spam(2)
>>> printexpr(2+3)
printexpr(2 + 3): 5
>>> printexpr(max(3,4))
printexpr(max(3, 4): 4
Как вы можете видеть из последних нескольких, это не надежно:
printexpr
.printexpr
.tokenize
-ing и утомительного поиска токенов, я печатаю 2+3
как 2 + 3
.Но в любом случае это должно дать вам представление о том, как вы можете делать почти все на Python ... но иногда вы этого не хотите. :)
Это действительно интересно. Кажется, есть много сложных команд, которые нужно разобрать, но спасибо за подробный ответ!
@AndrewYeh Я как бы ошибся в том, чтобы поиграть с как можно большим количеством забавных вещей вместо того, чтобы сделать их максимально удобными и / или надежными. Я искал хорошую отладочную библиотеку, которая делает это должным образом, но нашел только ту, которая обещает добавить поддержку Python 2.6 в дорожную карту, так что… Обычно, конечно, вы бы просто использовали сам отладчик, а не имитировали часть его работы. , поэтому имеет смысл, что никто не вложил много усилий в эту хорошо известную библиотеку.
Я проработал учебные пособия по Python и написал файл Python, прежде чем запускать его в командной строке с помощью «python lesson.py». Было неприятно сопоставлять вывод консоли с командой, которую я писал, поэтому я задал этот вопрос. Спасибо!
В зависимости от того, для чего вы это делаете, вас может заинтересовать MacroPy. Или, если это для целей отладки, есть библиотека, имя которой ускользает от меня, которая делает это с помощью взлома фреймов. Однако, если вы действительно хотите использовать это для «производственного кода», это, вероятно, плохая идея.