#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 вместо3. Для вашего второго примера, не должно ли это быть
sys.stdout.write(...)
вместоsys.stdout(...)
4.
def new_print(*args, **kwargs): sys.stdout.write(('print: ' '%s ' * len(args)) % tuple(args) "n")
5. Поскольку ваши новые
new_print
, ваша функция просто будет вызывать себя вечно.
Ответ №1:
У вас почти получилось. Вызовите old_print
свою новую функцию:
def new_print(*args, **kwargs):
old_print('print:', *args, **kwargs)
old_print = print
print = new_print