我々は、Python 3 print()
に知っているようでは、機能である、それは元のためにjson.dumps(indent=4)
飾るPythonの組み込みの印刷()関数
の下に包まれたの装飾が施されたバージョンを作成することが可能です。
print(mydict)
を呼び出すと、あなたはそれを行うためにデコレータ自体を必要としないprint(json.dumps(mydict, indent=4))
我々は、Python 3 print()
に知っているようでは、機能である、それは元のためにjson.dumps(indent=4)
飾るPythonの組み込みの印刷()関数
の下に包まれたの装飾が施されたバージョンを作成することが可能です。
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
として、元のアクセス)あなたは、old_print = builtins.print
を保存my_print
として、あなたの新しい関数を定義することができ、人々を混乱させ、その後、builtins.print = my_print
を行うにしたい場合。その後、変更されたprint
は、実際には普通のprint
を置き換えます。あなたの無実のことについて何も知らない他のモジュールであっても。しかしそれはさらに悪い考えです。
'builtins'モジュールをうまく利用してくれてありがとう、本当に便利で巧妙な解決策です。 – nehemiah
また、pprintをご覧ください。 https://docs.python.org/3/library/pprint.html
いいえ、print
は組み込み関数であり、組み込みのCレベルのクラスではないため不可能です。 This answerは、str
のような組み込みオブジェクトをサブクラス化し、そのメソッドの1つにデコレータを適用する方法を提供します。
@ BrenBarnの答えはどのように*可能かを示しています。 –
@AdamSmith Barnの答えはデコレータを使用していません。それが当初質問された問題です。 –
デコレータで終了:https://gist.github.com/anonymous/c6ee1be4befc1c38d34cd02553b31945 –
この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)
なぜこれはデコレータにする必要がありますか? –