我想重载print
函数,以便每当我调用它时,都打印args和文字args
。例如:
>>> print(2 + 2.0)
2 + 2.0 : 4.0
>>> print(2 > 2.0)
2 > 2.0 : False
我想代替创建一个新函数,例如func_print
可能更简单,更明智。我不确定,所以我将同时采用这两种方法以及所有附带的理由。
我一直在尝试学习装饰器,因为我认为它们是最好的方法,但是很难理解其结构。
答案 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