5

変数の値に基づいてログ レベルを変更する必要があります。例えば:

if accel >= 10.0:
    log_func = logging.critical # Critical for splat event
elif accel >= 2.0:
    log_func = logging.warning  # Warning for high-G
elif accel >= 1.0:
    log_func = logging.info     # Info for normal
else:
    log_func = logging.debug    # Debug otherwise
log_func("Collision with %0.1fG impact.", accel)

私のコード全体でこれのインスタンスがあります。より良い方法はありますか?

4

2 に答える 2

5

はい、Logger.log()代わりにメソッドを使用して、レベル定数を渡します。

import sys

# Map accel values to log levels
levels = (
    (10.0, logging.CRITICAL),
    (2.0, logging.WARNING), 
    (1.0, logging.INFO),
    (-sys.maxsize, logging.DEBUG)
)

logging.log(next(lev[1] for lev in levels if lev[0] <= accel),
    "Collision with %0.1fG impact.", accel)

レベル選択をユーティリティ関数にカプセル化できます。

def level_for_accel(accel):
    # return next matching log level for the given accel value
    return next(lev[1] for lev in levels if lev[0] <= accel)

logging.log(level_for_accel(accel), "Collision with %0.1fG impact.", accel)

ログ レベルは実際には整数でありCRITICALWARNING、 などの値は単なる定数です。多数の/ブランチaccelよりも読みやすい方法で、いくつかの単純なルールを使用して、1 つの値 (例: ) を一致するログ レベルに変換する方法はいくつもあります。ifelse

于 2013-02-27T18:07:04.633 に答える
3

変数 accel を取り、適切なロギング関数を返す関数を作成できます。そしてそれを呼び出します。おそらく、よりクリーンで保守しやすいコードになるでしょう。DRYは言うまでもありません。

def logger(accel):
    if accel >= 10.0:
        return logging.critical # Critical for splat event
    if accel >= 2.0:
        return logging.warning  # Warning for high-G
    if accel >= 1.0:
       return logging.info     # Info for normal
   else:
       return logging.debug    # Debug otherwise

次に、次のように使用できます

logger(12)("hello world")
于 2013-02-27T18:04:19.300 に答える