2017-10-10 168 views
1

我們知道在Python 3 print()是一個函數,是有可能創造一個裝飾的版本的它包裹json.dumps(indent=4)裝飾Python的內建print()函數

爲前下。

調用print(mydict)應產生相同的結果爲print(json.dumps(mydict, indent=4))

+1

爲什麼這必須是裝飾者? –

回答

7

你不需要一個裝飾本身做到這一點。只要定義一個新的功能,並調用它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,即使在其他對您的詭計一無所知的模塊中也是如此。但這是一個更糟糕的想法。

+1

感謝您使用'builtins'模塊的優雅使用,確實非常方便和巧妙。 – nehemiah

-2

不,這是不可能的,因爲print是一個內置的功能,它甚至不是一個內置的C級類。 This answer提供了一種子類化內置對象的方法,如str,並將裝飾器應用於其中一種方法。

+1

@BrenBarn的答案顯示了* * *的可能性。 –

+0

@AdamSmith穀倉的答案是不使用裝飾。這就是最初提出的問題。 –

+1

在這裏完成一個裝飾:https://gist.github.com/anonymous/c6ee1be4befc1c38d34cd02553b31945 –

0

感謝@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)