Переопределение встроенного print
Подскажите, реально переопределить встроенный print таким образом, чтобы он принимал произвольный ключевой аргумент?
print("test.", color=Fore.GREEN)
Хочу таким образом реализовать вывод цветного текста в терминал и параллельное логирование всего, но уже без ANSI escape characters.
class Logger(object):
def __init__(self):
self.terminal = sys.stdout
now = datetime.today().strftime('%m_%d_%Y-%I_%M_%S_%p')
self.log = open("log_for_" + now + ".log", "a", encoding="utf-8")
def write(self, message, color=""):
self.terminal.write(color + message)
self.log.write(message)
def flush(self):
pass
Либо как решить подобную задачу хорошо?
Ответы (1 шт):
Автор решения: turkindv
→ Ссылка
Вы конечно можете переопределить функцию print, но я бы советовал подумать о другом подходе, это достаточно плохая практика.
Если все таки решите переопределять, то пример ниже, функцию объявляем вне класса
from builtins import print as base_print
def print(*args, **kwargs):
if kwargs.get("color"):
# Ваша логика
# ...
# Следующие три строки это пример логики:
color = kwargs.pop("color") # не забываем удалить значение из kwargs
base_print(color, sep="")
base_print(*args, **kwargs)
else:
base_print(*args, **kwargs)
print("hello", [1,2,3,4], color="green")
вывод:
green
hello [1,2,3,4]
print("hello", [1,2,3,4])
вывод:
hello [1,2,3,4]
UPD: как заметил коментатор @Danis, если требуется оставить стандартный вывод при любой ситуацию, то можно упростить код
from builtins import print as base_print
def print(*args, **kwargs):
if kwargs.get("color"):
# Ваша логика
# ...
# Следующие три строки это пример логики:
color = kwargs.pop("color") # не забываем удалить значение из kwargs
base_print(color, sep="")
base_print(*args, **kwargs)