[英]How to print the args and evaluate them?
我想重載print
函數,以便每當調用它時,我都會打印args和文字args
。 例如:
>>> print(2 + 2.0)
2 + 2.0 : 4.0
>>> print(2 > 2.0)
2 > 2.0 : False
我想代替創建一個新函數,比如func_print
,可能更簡單,更明智。 我不確定,因此我將同時采用這兩種方法以及所有附帶的推理方法。
我一直在嘗試學習裝飾器,因為我認為它們是最好的方法,但是很難理解其結構。
您可以使用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
您要提及的期望行為(在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.