如何打印参数并进行评估?

时间:2018-08-02 05:09:12

标签: python python-3.x decorator

我想重载print函数,以便每当我调用它时,都打印args和文字args。例如:

>>> print(2 + 2.0)
2 + 2.0 : 4.0

>>> print(2 > 2.0)
2 > 2.0 : False

我想代替创建一个新函数,例如func_print可能更简单,更明智。我不确定,所以我将同时采用这两种方法以及所有附带的理由。

我一直在尝试学习装饰器,因为我认为它们是最好的方法,但是很难理解其结构。

2 个答案:

答案 0 :(得分:2)

您可以使用inspect.getframeinfo获取调用者的源代码,然后解析它以获得原始参数:

import inspect
import sys
import re

def print_args(*args, **kwargs):
    orig_print(re.findall(r'\((.*)\)', inspect.getframeinfo(sys._getframe(1))[3][0])[0], ': ', end='')
    orig_print(*args, **kwargs)

orig_print = print
print = print_args

print(2 + 2.0)

这将输出:

2 + 2.0 : 4.0

答案 1 :(得分:1)

您要提到的期望行为(在Python对表达式进行运算之前获取表达式)是不可能的(或者很容易实现,而无需深入研究Python的内部原理)。

当python看到2 + 2.0时,它将首先对其进行评估,并且您的函数将得到结果4.0。您的函数将不知道python如何首先获得结果。

解决此问题的一种方法是将表达式放入字符串中,然后使用eval()对其进行惰性计算:

def func_print(expression):
    print("{} : {}".format(expression, eval(expression)))

func_print('2 + 2.0')

此打印:

2 + 2.0 : 4.0

重载内置函数不是一个好主意,因为代码中的其他函数可能取决于旧的行为。

但是,如果您坚持认为,Python3中的print()只是经典功能,因此您可以自由地这样做:

import sys

def func_print(expression, *args, **kwargs):
    sys.stdout.write("{} : {}\n".format(expression, eval(expression)))

old_print_function = print

print = func_print
print('2 + 2.0')

print = old_print_function

结果是:

2 + 2.0 : 4.0