57

関数をオーバーロードしてprint、内部から通常の関数を呼び出すことはできますか? 私がやりたいのは、通常を呼び出してコピーをファイルに書き込むprintmy と呼びたい特定の行の後です。printprint

また、オーバーロードする方法もわかりませんprint。可変長引数の使い方がわかりません。すぐに調べますが、 オーバーロード print pythonは、私が使用しているものprintである2.xでオーバーロードできないことを教えてくれました。

4

9 に答える 9

63

バージョンリリース「Python 2.6」の時点で、以前の日付の回答を確認している場合は、元の投稿者の質問に対する新しい回答があります。

Python 2.6 以降では、print 関数を優先して 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)

もちろん、この時点では、この print 関数はモジュール全体のみであることを考慮する必要があります。オーバーライドすることもできますが__builtin__.print、オリジナルを保存する必要があります__builtin__.print__builtin__名前空間をいじる可能性があります。

于 2012-04-11T13:06:25.397 に答える
33

オーバーロードprintは、python 2.x でオーバーロードできないことに対処するための python 3.0 の設計機能です。

ただし、sys.stdout をオーバーライドできます。(。)必要なことを行う別のファイルのようなオブジェクトに割り当てるだけです。

または、スクリプトを unixteeコマンドにパイプすることもできます。python yourscript.py | tee output.txtstdout と output.txt の両方に出力されますが、これによりすべての出力がキャプチャされます。

于 2009-02-15T07:37:01.167 に答える
15
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)

)
于 2013-03-23T17:45:25.543 に答える
12

私は同じ問題に遭遇しました。

これはどう:

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から取得しました

于 2009-03-27T07:22:31.543 に答える
3

キーワードを置き換えることはできませんがprint(Python 2.x ではキーワードです)、オーバーライドと同様のことを行うprintために置き換えるのが一般的な方法です。たとえば、 のインスタンスを使用します。これにより、印刷されたすべてのデータがインスタンスに取り込まれ、その後で操作できるようになります。sys.stdoutprintStringIO.StringIOStringIO

于 2009-02-15T08:53:28.520 に答える
3

Python 2.x ではできません。print は関数ではなく、ステートメントであるためです。Python 3 では print は関数なので、オーバーライドできると思います (ただし、試したことはありません)。

于 2009-02-15T07:29:39.997 に答える
1

別のSOの質問で同じ質問に答えました

基本的に、最も簡単な解決策は、wsgi 構成ファイルで次のように出力を stderr にリダイレクトすることです。

sys.stdout = sys.stderr
于 2009-11-30T08:51:41.753 に答える
1

非常に単純な例として、Python3.4 (古いバージョンではテストしていません) の時点で、これはうまく機能します (モジュールの一番上に配置):

import time
def dprint(string):
  __builtins__.print("%f -- %s" % (time.time(), string))

print = dprint

これは、文字列パラメーターが文字列の場合にのみ機能することに注意してください... YMMV

于 2016-04-04T15:53:01.900 に答える
1

自分のアイデアを追加すると思っただけです... Eclipseでsthgを実行し、各印刷ステートメントでエンコード例外を取得せずに(Windows)CLIから実行できるという私の目的に適していました。何をしても、EncodingStdout をクラス ファイルのサブクラスにしないでください。「self.encoding = encoding」という行により、encoding 属性が None になります。

NB、このようなことに取り組んでいる間に私が見つけた1つのことは、「印刷」または「書き込み」を行う前にエンコーディング例外が発生することです。 "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" )
于 2014-02-22T19:05:39.687 に答える