装饰Python的内建print()函数
我们知道在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
不,这是不可能的,因为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)
为什么这必须是装饰者? –