Python: создайте функцию, которая принимает выражение и печатает как выражение в виде строки, так и его результат

При запуске кода с консоли я бы хотел, чтобы и команда, и ее вывод были напечатаны, и мне было интересно, есть ли способ избежать ввода выражения дважды.

Вместо:

print("max(3,4): ", max(3,4))

Мне нужна функция:

f = def(x):
    print(.....)

где f(max(3,4)) выводит результат "Вместо":

f(max(3,4))
>>max(3,4): 4

Это вообще возможно?

В зависимости от того, для чего вы это делаете, вас может заинтересовать MacroPy. Или, если это для целей отладки, есть библиотека, имя которой ускользает от меня, которая делает это с помощью взлома фреймов. Однако, если вы действительно хотите использовать это для «производственного кода», это, вероятно, плохая идея.

abarnert 02.05.2018 08:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Думаю нужен eval():

def f(expr:str):
    print("{}: {}".format(expr, eval(expr))

f("3 + 4 + max(2, 5)")

Выход:

3 + 4 + max(2, 5): 12

Я не знал функции eval, которая может быть удобна для запуска кучи команд из фрейма данных или чего-то еще. Спасибо!

Andrew Yeh 02.05.2018 09:51

Ради интереса установите библиотеку 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 ... но иногда вы этого не хотите. :)

Это действительно интересно. Кажется, есть много сложных команд, которые нужно разобрать, но спасибо за подробный ответ!

Andrew Yeh 02.05.2018 09:45

@AndrewYeh Я как бы ошибся в том, чтобы поиграть с как можно большим количеством забавных вещей вместо того, чтобы сделать их максимально удобными и / или надежными. Я искал хорошую отладочную библиотеку, которая делает это должным образом, но нашел только ту, которая обещает добавить поддержку Python 2.6 в дорожную карту, так что… Обычно, конечно, вы бы просто использовали сам отладчик, а не имитировали часть его работы. , поэтому имеет смысл, что никто не вложил много усилий в эту хорошо известную библиотеку.

abarnert 02.05.2018 09:47

Я проработал учебные пособия по Python и написал файл Python, прежде чем запускать его в командной строке с помощью «python lesson.py». Было неприятно сопоставлять вывод консоли с командой, которую я писал, поэтому я задал этот вопрос. Спасибо!

Andrew Yeh 02.05.2018 09:49

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