我們知道在Python 3 print()
是一個函數,是有可能創造一個裝飾的版本的它包裹json.dumps(indent=4)
裝飾Python的內建print()函數
爲前下。
調用print(mydict)
應產生相同的結果爲print(json.dumps(mydict, indent=4))
我們知道在Python 3 print()
是一個函數,是有可能創造一個裝飾的版本的它包裹json.dumps(indent=4)
裝飾Python的內建print()函數
爲前下。
調用print(mydict)
應產生相同的結果爲print(json.dumps(mydict, indent=4))
你不需要一個裝飾本身做到這一點。只要定義一個新的功能,並調用它print
:
import builtins
def print(*args, **kwargs):
builtins.print(json.dumps(*args, **kwargs, indent=4))
可以使用builtins
模塊如圖所示訪問原始打印功能。
問題是,這樣做並沒有真正獲得任何超過調用新功能的東西,除了print
,但它會迷惑人。
如果你想真正混淆的人,你可以存儲old_print = builtins.print
,定義新的功能my_print
(訪問原爲old_print
),然後做builtins.print = my_print
。然後,您的修改後的print
實際上會取代常規的print
,即使在其他對您的詭計一無所知的模塊中也是如此。但這是一個更糟糕的想法。
感謝您使用'builtins'模塊的優雅使用,確實非常方便和巧妙。 – nehemiah
或者,看看pprint。 https://docs.python.org/3/library/pprint.html
不,這是不可能的,因爲print
是一個內置的功能,它甚至不是一個內置的C級類。 This answer提供了一種子類化內置對象的方法,如str
,並將裝飾器應用於其中一種方法。
@BrenBarn的答案顯示了* * *的可能性。 –
@AdamSmith穀倉的答案是不使用裝飾。這就是最初提出的問題。 –
在這裏完成一個裝飾:https://gist.github.com/anonymous/c6ee1be4befc1c38d34cd02553b31945 –
感謝@Adam Smith爲此gist,張貼在這裏作爲參考。
import builtins
import functools
import json
orig_print = builtins.print
def indent4(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
return f(json.dumps(*args, **kwargs, indent=4))
return wrapped
@indent4
def print(*args, **kwargs):
return orig_print(*args, **kwargs)
爲什麼這必須是裝飾者? –