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.