簡體   English   中英

如何打印參數並進行評估?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM