从控制台运行代码时,我希望打印命令及其输出,我想知道是否有办法避免两次输入表达式。
而不是:
print("max(3,4): ", max(3,4))
我喜欢一个功能:
f = def(x):
print(.....)
其中f(max(3,4))
打印出"而不是"输出:
f(max(3,4))
>>max(3,4): 4
这有可能吗?
答案 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
。但无论如何,这应该让你知道如何在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