Переопределение встроенного 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)
→ Ссылка