Изменить встроенную функцию — Печать

#python #python-3.x

#python #python-3.x

Вопрос:

Я пытаюсь изменить встроенную функцию печати из python. Причина, по которой я пытаюсь добиться этого, заключается в том, что в моем приложении есть подробный файл sys.argv, и я хочу использовать print для вывода сообщения, независимо от того, является ли подробное значение True или False.

Я пытался использовать create a new function, но получаю ошибку рекурсии:

 >>> import builtins
>>> def new_print(*args, **kwargs):
...     print('print:', *args, **kwargs)
... 
>>> old_print = builtins.print
>>> old_print(1)
1
>>> builtins.print = new_print
>>> print(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in new_print
  File "<stdin>", line 2, in new_print
  File "<stdin>", line 2, in new_print
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
  

Я пробовал использовать sys.stdout():

 >>> import builtins
>>> import sys
>>> def new_print(*args, **kwargs):
...     sys.stdout(*args, **kwargs)
... 
>>> old_print = builtins.print
>>> old_print(1)
1
>>> builtins.print = new_print
>>> print(1
... )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in new_print
TypeError: '_io.TextIOWrapper' object is not callable

  

Несмотря на использование этих параметров, ни один из них, похоже, не работал должным образом.

Мне нужно, чтобы новая функция печати была доступна для всех файлов моего модуля, без необходимости импортировать ее каждый раз. Вот почему я пытаюсь изменить встроенную функцию, но я не уверен, что изменение этого в моем init.py файл будет иметь значение для других моих файлов.

Пожалуйста, если у вас есть какие-либо идеи о том, что может мне помочь, пожалуйста, оставьте их ниже.

Комментарии:

1. кажется, вы пытаетесь изобрести logging ..

2. В вашем первом примере, что произойдет, если у вас есть вызов old_print new_print вместо print ?

3. Для вашего второго примера, не должно ли это быть sys.stdout.write(...) вместо sys.stdout(...)

4. def new_print(*args, **kwargs): sys.stdout.write(('print: ' '%s ' * len(args)) % tuple(args) "n")

5. Поскольку ваши новые print вызовы print , но вы перезаписали print new_print , ваша функция просто будет вызывать себя вечно.

Ответ №1:

У вас почти получилось. Вызовите old_print свою новую функцию:

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

old_print = print
print = new_print