Как «перегрузить» функцию печати python «глобально»?
Я использую Python 2.6.6, и мне нужно перегрузить функцию печати Python по умолчанию. Мне нужно сделать это, потому что этот код может использоваться в системе, где для генерации вывода должна использоваться встроенная функция, в противном случае вывод не отображается.
Так, например, если у вас есть такой скрипт на python:
from __future__ import print_function
def NewPrint(Str):
with open("somefile.txt","a") as AFile:
AFile.write(Str)
def OverloadPrint():
global print
print = NewPrint
OverloadPrint()
print("ha")
Работает нормально. Вход в "перегружен» Печать находится в файле, указанном NewPrint.
Имея это в виду, я хотел бы иметь возможность запустить пару строк выше и иметь print, чтобы делать то, что NewPrint делает во время всего выполнения скрипта. Прямо сейчас, если я вызову функцию из другого модуля, который использует печать, она будет использовать встроенную печать, а не ту, которую я только что переписал. Я думаю, это как-то связано с пространствами имен и встроенными модулями, но мой python недостаточно хорош.
Редактировать:
Я старался быть простым, но, похоже, это вызвало еще большую путаницу ...
Функция, которая перегружает печать, будет печатать в GUI, поэтому нет необходимости заботиться о перенаправленииЕСЛИ функция перегружена.Я знаю, что мой пример не делает то, что на самом деле делает функция печати. Лучший пример того, как я думаю о его кодировании (все еще не очень хорошо, я знаю):
def hli_print(*args, **kw):
"""
print([object, ...], sep=' ', end='\n', file=sys.stdout)
"""
sep = kw.get('sep', ' ')
end = kw.get('end', '\n')
File = kw.get('file', sys.stdout)
args = [str(arg) for arg in args]
string = sep.join(args) + end
File.write(string)
hli_Print(string)
Из 2 выше вы можете увидеть функцию, которую я должен использовать для печати в GUI "hli_Print» это функция C ++, предоставляемая через оболочку Swig.
Мы используем только стандартную библиотеку и наши собственные оболочки swig, также наши разработчики используют print как функцию (привыкая к 3.X). Поэтому я не особо беспокоился о каком-то другом модуле, вызывающем print и имеющем что-то другое.Из всех комментариев я предполагаю, что использование функции print_ () вместо print () (что мы и делаем в настоящее время) может быть лучшим, но мне стало очень любопытно посмотреть, можно ли в python сделать то, что я описано.