装饰Python内置的print()函数

13

众所周知,在Python 3中print()是一个函数,是否有可能创建一个装饰版本并在json.dumps(indent=4)下进行包装?

例如:

调用print(mydict)应该产生与print(json.dumps(mydict, indent=4))相同的结果。


1
为什么这必须是一个装饰器? - juanpa.arrivillaga
4个回答

19

你不需要专门的装饰器来做到这一点。只需定义一个新函数并将其命名为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 模块,这确实是一个非常方便和聪明的解决方案。 - nehem
建议将其命名为iprint,以表示缩进。 - ATH

2

除了BrenBarn的答案(被采纳),这里还要发布由@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)

0

-3
不,这是不可能的,因为print是一个内置函数,甚至不是内置的C级类。 此答案提供了一种方法可以对像str这样的内置对象进行子类处理,并将装饰器应用于其中的一种方法。

@AdamSmith Barn的回答没有使用装饰器。这就是问题最初提出的内容。 - Josh Weinstein
1
在这里使用了一个装饰器:https://gist.github.com/anonymous/c6ee1be4befc1c38d34cd02553b31945 - Adam Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接