Я хочу проверить, вызывается ли оператор печати, и добавить после него дополнительный оператор печати, не добавляя вручную пустой оператор печати после каждого экземпляра. Мой вывод в настоящее время выглядит следующим образом:
Hello
Hello
Hello
Hello
*(outputs this 10 times)*
в то время как я хотел бы, чтобы это выглядело так:
Hello
Hello
Hello
Hello
*(output 10 times as well in this pattern)*
Я предпочитаю использовать декораторы, так как это самое простое и красивое решение, но другое решение тоже подойдет!
Я попытался спросить ChatGPT, но это ничего не меняет в выводе.
В настоящее время это мой код:
def readability(func):
def wrapper(*args,**kwargs):
result = func(*args, **kwargs)
if callable(func) and func.__name__ == 'print':
print(' ')
return result
return wrapper
@readability
def printing():
j=10
while j>0:
print('hello')
j-=1
printing()
Я хочу иметь возможность применять его к другим функциям, используя операторы печати, привет - это просто образец текста, фактический текст будет длиннее и будет отличаться от строки к строке.
Оригинальный ответ:
original_print = print
def print(*args):
original_print(*args)
original_print(' ')
print('Hello')
Улучшенный ответ с использованием __builtins__
:
def print(*args):
__builtins__.print(*args)
__builtins__.print(' ')
Обе версии производят следующий вывод:
Hello
<blank line>
Это сработало для меня и сделало именно так, как я хотел, спасибо! Единственная проблема заключалась в том, что он разбил весь мой файл совместной работы, и мне приходилось создавать новый файл каждый раз, когда я пытался запустить его снова, но я исправил это, запустив его один раз, а затем снова удалив.
@Acion Я не понимаю вашего комментария, но звучит не очень хорошо. Могу ли я что-нибудь добавить, чтобы улучшить свой ответ?
Это не делает ничего, что print(txt, end = ' \n\n')
не делает. На самом деле не очень хорошая идея иметь функцию, которая рекурсивно вызывает встроенную функцию или которая переопределяет имя встроенной функции без всякой цели.
@user19077881 user19077881 это может быть не лучшая идея. Пожалуйста, уточните свои возражения против него. Тем не менее, это решает проблему, так что это не «напрасно». Как вы утверждаете, также нет рекурсивного вызова. Кажется, у вас есть лучшее решение, пожалуйста, опубликуйте его как ответ.
Вы можете использовать contextlib.ContextDecorator, чтобы иметь возможность использовать либо декоратор, либо менеджер контекста, что позволяет вам более точно контролировать, где вы хотите использовать свою измененную функцию print
.
Чтобы заменить print
, вам просто нужно использовать print = your_own_function
. Вы по-прежнему можете получить доступ к оригиналу print
как __builtins__.print
.
Итак, пример может быть с двумя примерами персонализированных функций печати, которые вы можете применить где угодно: к целой функции с помощью декоратора или к фрагменту кода с помощью диспетчера контекста:
from contextlib import ContextDecorator
def double_print(data):
__builtins__.print(data)
__builtins__.print()
def underlined_print(data):
__builtins__.print(data)
__builtins__.print('-'*len(str(data)))
class my_print_context(ContextDecorator):
def __init__(self, print_function):
self.print = print_function
def __enter__(self):
global print
print = self.print
return self
def __exit__(self, *exc):
global print
print = __builtins__.print
return False
def nums():
for i in range(3):
print(i)
Мы можем использовать это так:
@my_print_context(double_print)
def nums2():
for i in range(3):
print(i)
print('\nNormal')
nums()
print('\nDecorated')
nums2()
print('\nWith context manager')
with my_print_context(underlined_print):
print('Hello')
print('We are underlined')
nums()
print('\nAfter the context')
nums()
который выводит:
Normal
0
1
2
Decorated
0
1
2
With context manager
Hello
-----
We are underlined
-----------------
0
-
1
-
2
-
After the context
0
1
2
Проголосовал за использование __builtins__
, если ни за что другое. Я знал, что он существует, но не мог вспомнить и не найти его, когда писал свой ответ. Это намного лучше моего.
почему бы просто не использовать
print('hello\n\n' * 10)