Есть ли способ переопределить метод печати в Python 3.x? - PullRequest
0 голосов
/ 28 мая 2020

Довольно простой вопрос - я искал, но не нашел ответа на этот вопрос.

Это может быть немного глупо, но мне было любопытно, можно ли подключиться к функции print(*arg, **kwarg) из python 3.X и переопределить ее / добавить time.sleep(var) в конце вызов.

Конечно, я мог бы просто определить другой метод и обернуть его time.sleep(var), но мне было просто любопытно, как можно go переопределить предварительно созданные функции.

Ответы [ 4 ]

3 голосов
/ 28 мая 2020

Если вы хотите исправить любую функцию глобально, например, для целей тестирования / отладки, самый безопасный способ - использовать 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() 
2 голосов
/ 28 мая 2020

Вы также можете попробовать этот лайнер

out = print
print = lambda *args, **kwargs: [time.sleep(1), out(*args, **kwargs)]
1 голос
/ 28 мая 2020

Вы можете, вы могли бы сделать что-то вроде:

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
0 голосов
/ 28 мая 2020

Вот пример, чтобы показать, что это будет работать. Это определенно не рекомендуется, как вы знаете.

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

print = new_print

print("Test")

Я всегда добавляю этот текст

Test

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...