我可以重载print
函数并从内部调用正常函数吗?我想要做的是在我想print
调用 my的特定行之后print
,它将调用正常print
并将副本写入文件。
我也不知道如何超载print
。我不知道如何做可变长度参数。我很快就会查到它,但 重载打印 python刚刚告诉我我不能print
在2.x中重载,这是我正在使用的。
我可以重载print
函数并从内部调用正常函数吗?我想要做的是在我想print
调用 my的特定行之后print
,它将调用正常print
并将副本写入文件。
我也不知道如何超载print
。我不知道如何做可变长度参数。我很快就会查到它,但 重载打印 python刚刚告诉我我不能print
在2.x中重载,这是我正在使用的。
对于那些查看以前日期的答案的人来说,从版本发布“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__
命名空间混淆。
重载print
是 python 3.0 的一个设计特性,用于解决你在 python 2.x 中缺乏这样做的能力。
但是,您可以覆盖 sys.stdout。(示例。)只需将其分配给另一个类似文件的对象即可。
或者,您可以通过 unixtee
命令通过管道传输您的脚本。python yourscript.py | tee output.txt
将打印到 stdout 和 output.txt,但这将捕获所有输出。
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)
)
我遇到了同样的问题。
这个怎么样:
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
尽管您不能替换print
关键字(在 Python 2.xprint
中是关键字),但通常的做法是替换sys.stdout
以执行类似于print
覆盖的操作;例如,使用StringIO.StringIO
. 这将捕获StringIO
实例中的所有打印数据,之后您可以对其进行操作。
在 Python 2.x 中你不能,因为 print 不是一个函数,它是一个语句。在 Python 3 中 print 是一个函数,所以我想它可以被覆盖(虽然没有尝试过)。
只是想我会添加我的想法......适合我能够在 Eclipse 中运行 sthg 然后从(Windows)CLI 运行而不会在每个打印语句中出现编码异常的目的。无论您做什么,都不要使 EncodingStdout 成为类文件的子类:“self.encoding = encoding”行将导致编码属性为无!
注意,我在一天中与这些东西搏斗时发现的一件事是,在“打印”或“写入”之前引发了编码异常:这是在参数化字符串(即“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" )
对于一个非常简单的示例,从 Python3.4 开始(尚未使用旧版本进行测试),这对我来说效果很好(放置在模块的顶部):
import time
def dprint(string):
__builtins__.print("%f -- %s" % (time.time(), string))
print = dprint
请注意,这仅适用于字符串参数是 str... YMMV