有没有办法覆盖 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)]
很简单的问题 - 我搜索过但没有找到这个问题的答案。
这样做可能有点傻,但我很好奇是否可以挂接到 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)]