2017-10-10 165 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)