2017-10-10 17 views
1

我々は、Python 3 print()に知っているようでは、機能である、それは元のためにjson.dumps(indent=4)飾るPythonの組み込みの印刷()関数

の下に包まれたの装飾が施されたバージョンを作成することが可能です。

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として、元のアクセス)あなたは、old_print = builtins.printを保存my_printとして、あなたの新しい関数を定義することができ、人々を混乱させ、その後、builtins.print = my_printを行うにしたい場合。その後、変更されたprintは、実際には普通のprintを置き換えます。あなたの無実のことについて何も知らない他のモジュールであっても。しかしそれはさらに悪い考えです。

+1

'builtins'モジュールをうまく利用してくれてありがとう、本当に便利で巧妙な解決策です。 – nehemiah

-2

いいえ、printは組み込み関数であり、組み込みのCレベルのクラスではないため不可能です。 This answerは、strのような組み込みオブジェクトをサブクラス化し、そのメソッドの1つにデコレータを適用する方法を提供します。

+1

@ BrenBarnの答えはどのように*可能かを示しています。 –

+0

@AdamSmith Barnの答えはデコレータを使用していません。それが当初質問された問題です。 –

+1

デコレータで終了:https://gist.github.com/anonymous/c6ee1be4befc1c38d34cd02553b31945 –

0

このgistのための@Adam Smithのおかげで、ここに参照用に掲載しています。

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)