print
関数をオーバーロードして、内部から通常の関数を呼び出すことはできますか?私がしたいのは、print
がprint
を呼び出して通常のprint
を呼び出し、ファイルにコピーを書き込む特定の行の後です。
また、print
をオーバーロードする方法がわかりません。可変長引数の実行方法がわかりません。すぐに調べますが、 print pythonのオーバーロード2.xのprint
をオーバーロードできないと言っただけです私が使用しているもの。
以前の日付の回答を確認している場合、バージョンリリース "Python 2.6"の時点で、元の投稿者の質問に対する新しい回答があります。
Python 2.6以降では、print関数を優先してprintステートメントを無効にし、独自の印刷関数でprint関数をオーバーライドできます。
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をオーバーライドできます。 ( example 。)希望することを行う別のファイルのようなオブジェクトにそれを割り当てるだけです。
または、unix tee
コマンドを使用してスクリプトをパイプすることもできます。 python yourscript.py | tee output.txt
はstdoutとoutput.txtの両方に出力されますが、これによりすべての出力がキャプチャされます。
私は同じ問題に出会いました。
これはどう:
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 から取得されました
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)
)
print
キーワードを置き換えることはできませんが(Python 2.x print
はキーワードです)、sys.stdout
を置き換えるのが一般的です。たとえばStringIO.StringIO
のインスタンスを使用して、print
のオーバーライドに似た操作を行います。これにより、StringIO
インスタンス内のすべての印刷データがキャプチャされ、その後操作できます。 。
In Python 2.xではできません。printは関数ではないため、ステートメントです。InPython 3 printは関数なので、オーバーライドできると仮定します(ただし、試したことはありません)。
非常に単純な例として、Python3.4(古いバージョンではテストされていません)の時点で、これはうまく機能します(モジュールの先頭に配置):
import time
def dprint(string):
__builtins__.print("%f -- %s" % (time.time(), string))
print = dprint
文字列パラメーターが文字列の場合にのみ機能します。..YMMV
私は自分のアイデアを追加すると思った... Eclipseでsthgを実行し、各printステートメントでエンコード例外を取得せずに(Windows)CLIから実行できるという目的に合っていました。 EncodingStdoutをクラスファイルのサブクラスにしないと、「self.encoding = encoding」という行のエンコーディング属性がNoneになります。
NBこのことに取り組んでいる間に見つけた1つのことは、「印刷」または「書き込み」を行う前にエンコード例外が発生することです。それは、パラメーター化された文字列(つまり、「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" )