Перегрузка print python
Можно ли перегрузить функцию print
и вызвать нормальную функцию изнутри? Я хочу, чтобы после определенной строки я хочу, чтобы print
вызывал мой print
, который вызывает обычный print
и записывает копию в файл.
Также я не знаю, как перегрузить print
. Я не знаю, как делать аргументы переменной длины. Я скоро посмотрю, но перегрузите python, просто сказал мне, что я не могу перегрузить print
в 2.x, что и есть то, что я использую.
Ответы
Ответ 1
Для тех, кто просматривает ранее датированные ответы, начиная с версии версии "Python 2.6" есть новый ответ на исходный вопрос о посте.
В Python 2.6 и выше вы можете отключить инструкцию печати в пользу функции печати, а затем переопределить функцию печати с помощью собственной функции печати:
from __future__ import print_function
# This must be the first statement before other statements.
# You may only put a quoted or triple quoted string,
# Python comments, other future statements, or blank lines before the __future__ line.
try:
import __builtin__
except ImportError:
# Python 3
import builtins as __builtin__
def print(*args, **kwargs):
"""My custom print() function."""
# Adding new arguments to the print function signature
# is probably a bad idea.
# Instead consider testing if custom argument keywords
# are present in kwargs
__builtin__.print('My overridden print() function!')
return __builtin__.print(*args, **kwargs)
Конечно, вам нужно будет подумать, что эта функция печати в данный момент является только модульной. Вы можете переопределить __builtin__.print
, но вам нужно сохранить оригинал __builtin__.print
; вероятно, с ошибкой с пространством имен __builtin__
.
Ответ 2
Перегрузка print
представляет собой конструктивную особенность python 3.0 для устранения вашей недостаточной возможности сделать это в python 2.x.
Однако вы можете переопределить sys.stdout. (пример.) Просто назначьте его другому файлоподобному объекту, который сделает то, что вы хотите.
В качестве альтернативы вы можете просто передать свой script через команду unix tee
. python yourscript.py | tee output.txt
будет печатать как на stdout, так и на output.txt, но это будет захватывать весь вывод.
Ответ 3
Я столкнулся с той же проблемой.
Как насчет этого:
class writer :
def __init__(self, *writers) :
self.writers = writers
def write(self, text) :
for w in self.writers :
w.write(text)
import sys
saved = sys.stdout
fout = file('out.log', 'w')
sys.stdout = writer(sys.stdout, fout)
print "There you go."
sys.stdout = saved
fout.close()
Это работало как прелесть для меня.
Это было взято из http://mail.python.org/pipermail/python-list/2003-February/188788.html
Ответ 4
class MovieDesc:
name = "Name"
genders = "Genders"
country = "Country"
def __str__(self):
#Do whatever you want here
return "Name: {0}\tGenders: {1} Country: {2} ".format(self.name,self.genders,self.country)
)
Ответ 5
Хотя вы не можете заменить ключевое слово print
(в Python 2.x print
есть ключевое слово), обычной практикой является замена sys.stdout
, чтобы сделать что-то похожее на print
overriding; например, с экземпляром StringIO.StringIO
. Это приведет к захвату всех распечатанных данных в экземпляре StringIO
, после чего вы сможете манипулировать им.
Ответ 6
В Python 2.x вы не можете, потому что печать не является функцией, это утверждение. В Python 3 print - это функция, поэтому я предполагаю, что она может быть переопределена (хотя и не пробовала).
Ответ 7
Я ответил на тот же вопрос на другой вопрос SO
По сути, самым простым решением является просто перенаправить вывод на stderr следующим образом, в конфигурационный файл wsgi.
sys.stdout = sys.stderr
Ответ 8
просто подумал, что я добавлю свою идею... подгонял мои цели, чтобы запустить sthg в Eclipse, а затем запустить из (Windows) CLI, не получая исключений в кодировке с каждым выражением печати.
Что бы вы ни делали, не делайте EncodingStdout подклассом файла класса: строка "self.encoding = encoding" приведет к тому, что атрибут кодировки будет None!
NB. Одна вещь, которую я узнал во время дневного схватки с этим материалом, заключается в том, что исключение кодирования поднимается до того, как вы получите "печать" или "запись": это когда параметризованная строка (т.е. "mondodod% s blah blah% s" % ( "blip", "blap" )) построено... что??? "рамки"?
class EncodingStdout( object ):
def __init__( self, encoding='utf-8' ):
self.encoding = encoding
def write_ln( self, *args ):
if len( args ) < 2:
sys.__stdout__.write( args[ 0 ] + '\n' )
else:
if not isinstance( args[ 0 ], basestring ):
raise Exception( "first arg was %s, type %s" % ( args[ 0 ], type( args[ 0 ]) ))
# if the default encoding is UTF-8 don't bother with encoding
if sys.getdefaultencoding() != 'utf-8':
encoded_args = [ args[ 0 ] ]
for i in range( 1, len( args )):
# numbers (for example) do not have an attribute "encode"
if hasattr( args[ i ], 'encode' ):
encoded_args.append( args[ i ].encode( self.encoding, 'replace' ) )
else:
encoded_args.append( args[ i ])
args = encoded_args
sys.__stdout__.write( args[ 0 ] % tuple( args[ 1 : ] ) + '\n' )
# write seems to need a flush
sys.__stdout__.flush()
def __getattr__( self, name ):
return sys.__stdout__.__getattribute__( name )
print "=== A mondodod %s %s" % ( "été", "pluviôse, irritée contre la ville entière" )
sys.stdout = EncodingStdout()
sys.stdout.write_ln( "=== B mondodod %s %s", "été", "pluviôse, irritée contre la ville entière" )
# convenience method
def pr( *args ):
sys.stdout.write_ln( *args )
pr( "=== C mondodod %s %s", "été", "pluviôse, irritée contre la ville entière" )
Ответ 9
Для очень простого примера, начиная с Python3.4 (не тестировался с более старыми версиями), это хорошо работает для меня (размещено в верхней части модуля):
import time
def dprint(string):
__builtins__.print("%f -- %s" % (time.time(), string))
print = dprint
Обратите внимание, это работает только в том случае, если строковым параметром является str... YMMV