Python:创建一个函数,该函数接受表达式并将表达式打印为字符串及其结果

时间:2018-05-02 06:45:21

标签: python

从控制台运行代码时,我希望打印命令及其输出,我想知道是否有办法避免两次输入表达式。

而不是:

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

我喜欢一个功能:

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

其中f(max(3,4))打印出"而不是"输出:

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

这有可能吗?

2 个答案:

答案 0 :(得分:2)

只是为了好玩,安装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 - 并且繁琐地搜索令牌,我将2+3打印为2 + 3
  • 我应该实际处理这些parens,而不是剥掉任何可能多余的外壳,然后添加一对。

但无论如何,这应该让你知道如何在Python中做几乎任何事情......但有时候你不想这样做。 :)

答案 1 :(得分:1)

我认为你需要eval()

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

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

输出:

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