2

Pythonで、同じように引数を取る関数を記述したいのですがprint、文字列をstdoutに出力する代わりに、テキストファイルにフォーマットされた文字列を記述したいと思います。

文字列のフォーマットを受け入れるために、このような関数の引数の引数をどのように定義すればよいのでしょうか。

代わりになるものを探しています

print "Test"

MyLog "Test"

ただし、%rgumentsもサポートする必要があります。これまでのところ、私はこれを思いついただけです:

def logger(txt):    
fh = open (LOGFILE, "a") #Get handle in append mode
fh.write(txt)
fh.close()
print txt
return True 

これは単純な文字列では問題なく機能しますが、%引数を取ることも、ロガー「TEST」のように呼び出すこともできないと思います。

4

3 に答える 3

5

「printchevron」ステートメントを使用して、次のように実行できます。

with open('filename.txt', 'w') as f:
  print >> f, my_object

printステートメントのドキュメントを参照してください。

もちろん、print()MartijnPietersが示唆しているように関数を使用する方がおそらく良い習慣です。

アップデート

loggerprint chevron構文を使用するように関数を変更すると、次のようになります。

def logger(txt):    
  fh = open (LOGFILE, "a") #Get handle in append mode
  fh.write(txt)
  fh.close()
  print >>fh, txt
  return True 

この関数を次のように呼び出す場合:

now, duration = 4.0, 2.0
logger("User request at %f time took %f seconds." % (now, duration))

ログファイルには次のような行があります。

User request at 4.0 time took 2.0 seconds.

したがって、これを%フォーマットで使用できます(ただし、実際には新しいスタイルのフォーマットを確認する必要があります)が、次のように呼び出すことはできません。

logger "User request at %f time took %f seconds." % (now, duration)

これは、printが言語レベルの構成要素である単純なステートメントであり、Pythonに追加できないためです。

于 2012-11-07T17:40:39.277 に答える
4

print() すでにそれを行うことができます:

print(somestring, file=someopenfile)

Python 2を使用している場合は、を使用from __future__ import print_functionして同じ機能を取得します。

関数と同じ引数を使用して関数をいつでも実装し、printそれを置換として使用するか、ワイルドカード引数(*args、 )を使用して、必要に応じてキーワード引数を**kw追加できます。次の構造を介して、fileいつでも元の組み込み関数にアクセスできます。print()__builtins__

def print(*args, **kw):
    if 'file' not in kw:
        # print to a file instead of stdout
        kw['file'] = someopenfile
    return __builtins__.print(*args, **kw)
于 2012-11-07T17:38:11.837 に答える
1

デフォルトではにprint出力されるので、私のこの回答sys.stdoutで説明されているようにを作成できます。これにより、ステートメントまたは関数バージョンのどちらを使用しているかに関係なく、通常のを使用できます。contextmanagerprint

于 2012-11-07T18:23:25.007 に答える