装饰Python的内置print()函数

时间:2017-10-10 04:28:57

标签: python python-decorators

正如我们在Python 3中所知print()是一个函数,是否可以在json.dumps(indent=4)

下创建它的装饰版本

代表

调用print(mydict)应该产生与print(json.dumps(mydict, indent=4))

相同的结果

4 个答案:

答案 0 :(得分:10)

你本身不需要装饰师。只需定义一个新函数并将其命名为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 :(得分:1)

答案 2 :(得分: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)

答案 3 :(得分:-2)

不,这是不可能的,因为print是内置函数,它甚至不是内置的C级类。 This answer提供了一种将内置对象子类化为str的方法,并将装饰器应用于其中一种方法。