Como “sobrecarregar” a função de impressão do python “globalmente”?

Eu estou usando python 2.6.6 e eu preciso sobrecarregar a função de impressão python padrão. Eu preciso fazê-lo porque esse código pode ser usado em um sistema onde uma função interna deve ser usada para gerar a saída, caso contrário, nenhuma saída é exibida.

Então, por exemplo, se você tem um script python como este:

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")

Funciona bem. A entrada para a impressão "sobrecarregada" está no arquivo especificado pelo NewPrint.

Agora, com isso em mente, gostaria de poder executar o par de linhas acima e imprimir para fazer o que o NewPrint faz durante toda a execução do script. Agora, se eu chamar uma função de outro módulo que usa impressão, ela usará a impressão integrada e não a que acabei de substituir. Eu acho que isso tem algo a ver com namespaces e built-ins, mas meu python não é bom o suficiente.

Editar:

Eu tentei manter simples, mas parece que isso causou mais confusão ...

A função que sobrecarrega a impressão será impressa em uma GUI, portanto, não há necessidade de se preocupar com o redirecionamentoE SE a função está sobrecarregada.

Eu sei que meu exemplo não faz o que a função de impressão realmente faz. Um exemplo melhor de como estou pensando em codificá-lo é (ainda não é ótimo, eu sei):

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)

De 2 acima você pode ver a função que eu tenho que usar para imprimir na GUI "hli_Print" é uma função C ++ exposta através de um wrapper swig.

Nós usamos somente a biblioteca padrão e nossos próprios wrappers swig, também nossos desenvolvedores usam print como uma função (se acostumar com 3.X). Então eu realmente não me preocupei muito com algum outro módulo chamando print e tendo algo diferente.

De todos os comentários eu acho que usar apenas algumas funções print_ () ao invés de print () (que é o que nós fazemos atualmente) pode ser o melhor, mas eu fiquei realmente curioso para ver se em python seria possível fazer o que eu descrito.

questionAnswers(2)

yourAnswerToTheQuestion