有没有办法覆盖 Python 3.x 中的打印方法?

Is there a way to override the print method in Python 3.x?

很简单的问题 - 我搜索过但没有找到这个问题的答案。

这样做可能有点傻,但我很好奇是否可以挂接到 python 3.X 的 print(*arg, **kwarg) 函数并覆盖它/添加 time.sleep(var) 在调用结束时。

当然我可以定义另一种方法并用 time.sleep(var) 包装它,但我只是好奇如何覆盖预构建函数。

只是为了证明它可以工作,这里是一个例子。如您所知,绝对不推荐。

import sys
def new_print(msg):
    sys.stdout.write("I always add this text\n")
    sys.stdout.write(msg)

print = new_print

print("Test")

I always add this text

Test

你可以,你可以这样做:

def new_print(*args, **kwargs):
    # Your new print function here
    pass

print = new_print

建议您保存旧的打印函数,如果您想在打印函数中使用它,您将需要它。 你可以这样做

old_print = print
def new_print(*args, **kwargs):
    old_print(*args, **kwargs)

print = new_print

如果您现在想为其添加睡眠功能,只需将其放入新函数中即可

import time

old_print = print
def new_print(*args, **kwargs):
    old_print(*args, **kwargs)
    time.sleep(5)

print = new_print

如果你想全局修补任何功能,例如出于测试/调试目的,最安全的方法是使用 unittest.mock.patch():

def x():
    '''the code under test'''
    print('Hello, world!')

...
from unittest.mock import patch
orig_print = print

with patch('builtins.print') as m:
    def my_print(*args, **kwargs):
        orig_print('PATCHED:', *args, **kwargs)

    m.side_effect = my_print

    x()  # prints 'PATCHED: Hello, world!'

# prints 'Hello, world!', because the patch context is exited
# and the original function is restored: 
x() 

你也可以试试这个衬垫

out = print
print = lambda *args, **kwargs: [time.sleep(1), out(*args, **kwargs)]