有没有一种方法可以覆盖Python 3.x中的print方法?

时间:2020-05-28 07:27:58

标签: python python-3.x methods python-object

一个非常简单的问题-我已搜索但未找到此问题的答案。

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

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

4 个答案:

答案 0 :(得分:3)

如果要全局修补任何功能,例如为了进行测试/调试,最安全的方法是使用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() 

答案 1 :(得分:2)

您也可以尝试使用这种内胆

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

答案 2 :(得分:1)

您可以,您可以执行以下操作:

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

答案 3 :(得分:0)

只是为了证明它可以工作,这里举一个例子。如您所知,绝对不建议这样做。

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

print = new_print

print("Test")

我总是添加此文本

测试