3

私はPythonを始めたばかりで、心配しすぎているかもしれませんが、とにかく...

log = "/tmp/trefnoc.log"

def logThis (text, display=""):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    if display != None:
        print msg + display
    logfile = open(log, "a")
    logfile.write(msg + "\n")
    logfile.close()
    return msg

def logThisAndExit (text, display=""):
    msg = logThis(text, display=None)
    sys.exit(msg + display)

それは機能していますが、私はそれがどのように見えるかが好きではありません。これを書くためのより良い方法はありますか(たぶん1つの関数だけで)、そして私が終了する際に懸念すべき他のこと はありますか?


ここで、いくつかの背景について説明します(ただし、trefnocについては説明しません)。

logThisログに記録して表示するためだけに電話することもあります。それ以外の場合は、それを呼び出して終了したいと思います。当初、私はこれを行っていました:

logThis ("ERROR. EXITING")
sys.exit()

それから私はそれが適切に設定されないだろうと考えましたstderr、したがって現在のコードは上部に示されています。

私の最初のアイデアは、実際には「sys.exit」を引数として渡し、logThis ("ERROR. EXITING", call=sys.exit)次のように定義することでした(関連する相違点のみを示しています)。

def logThis (text, display="", call=print):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    call msg + display

しかし、それは明らかに機能しませんでした。Pythonは変数内に関数を格納しないと思います。Pythonが関数を受け取る変数を持つことができるかどうかを(すばやく)見つけることができませんでした!多分関数を使用していますか?私は本当に常にそれらを避けようとします、トー。確かに私は別のものの代わりに使用することを考えましたが、それは良くも悪くもありません。evalifdef

とにかく、何か考えはありますか?

4

5 に答える 5

2

「logThisAndExit」の理由はありません。入力する手間が省けます。

sys.exit(logThis(text)+display)

(比較logThisAndExit(text, display)

また

sys.exit(logThis(text))

(比較logThisAndExit(text)

ログ行としてフォーマットされた終了メッセージが好きな理由は完全にはわかりません。

元の質問への回答:括弧がありません:call(msg+display)正常に動作します。しかし、それはロギング/エグジットのものの過剰設計だと思います。コードを管理する人は誰でも、関数がいつ終了するか、いつ終了しないかを知るために関数を理解する必要があります。

于 2010-04-14T00:21:49.937 に答える
2

ロギングの場合、ロギングモジュールを使用する方がおそらく簡単です。

終了するために、エラーが発生した場合は、次を使用します。

sys.exit(1)

エラーがない場合は、スクリプトでステートメントを実行するか、次のいずれかを実行します。

sys.exit(0)
于 2010-04-14T08:31:39.150 に答える
1

デフォルトで。logThisと呼ばれる最後の引数を取るように変更し、そのメソッドの最後のステップとして、値がtrueの場合はを呼び出すことができます。shouldExitNonesys.exit

于 2010-04-14T00:20:08.787 に答える
1

printPython <3では、関数ではなくキーワードです。これを試してください。

def do_print(x):
    print x

def logThis (text, display="", call=do_print):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    call(msg + display)

loggingモジュールを使用しない理由はありますか?(http://onlamp.com/pub/a/python/2005/06/02/logging.htmlを参照)

于 2010-04-14T00:22:04.107 に答える
0

参考までに、これはDavidとmoshezからのヒントを取り入れた後の私の最後のコードです。結局、今のところ1つの関数だけが必要だと思いました。みんな、ありがとう!

log = "/tmp/trefnoc.log"

def logThis (text, display=""):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    if display != None:
        print msg + display
    logfile = open(log, "a")
    logfile.write(msg + "\n")
    logfile.close()
    return msg

# how to call it on exit:
sys.exit(logThis("ERROR, EXITING", display=None))
于 2010-04-14T01:16:24.057 に答える