2017-08-14 15 views
1

すべてのプリントを、私が維持しているライブラリのロギングコールに変換する時が来ています。私はそれをログに記録しようとするとカンマで区切った数字を桁区切り記号として記録する方法は?

>>> n = 4000000 
>>> print(f"this bird wouldn't voom if you put {n:,} volts through it!") 
this bird wouldn't voom if you put 4,000,000 volts through it! 

:印刷のコールの中には、この(簡体字)のように、str.formatを使用している

>>> log.warning("this bird wouldn't voom if you put %d, volts through it!", n) 
WARNING:root:this bird wouldn't voom if you put 4000000, volts through it! 

が、これは正しく桁区切り記号を指定していないようです。 Pythonのstdlibロギングモジュールが必要とする%-formatting構文を使用するときに、どのように桁区切り記号を指定しますか?

>>> log.warning("this bird wouldn't voom if you put %s volts through it!", format(n, ',')) 
WARNING:root:this bird wouldn't voom if you put 4,000,000 volts through it! 
+2

暗闇の中で撮影する: '' logging.Formatter'](https://docs.python.org/3/library/logging.html#logging.Formatter)で 'style =" {"' –

+0

So 、多分[ここ](https://docs.python.org/3/howto/logging-cookbook.html#use-of-alternative-formatting-styles)が役に立ちます。 –

+1

@ juanpa.arrivillaga私は過去にそれを試してみましたが、それを働かせることはできませんでした。 '{'スタイルはテンプレートフォーマット自体に使用されますが、実際のメッセージのパラメータには使用されません。しかし、私は何かを見逃しているかもしれません - あなたがそれを働かせることができれば、是非答えを加えてください。 – wim

答えて

2

:現在、直接番号などの代わりに、ロギングの、所望の出力が得られていますが、変数はstr.formatを使用して、最初にフォーマットし、再度文字列としてフォーマットされているので間違っているようだ、この回避策を使用して、

それはloggingの制限だとそれが実際にdocumentation(少なくとも一箇所)で述べています:

logging.debug(msg, *args, **kwargs)

レベルDEBUGのメッセージをルート・ロガーに記録します。 msgはメッセージフォーマット文字列であり、引数はmsgにマージされる引数で、文字列フォーマット演算子を使用します。 (これはあなたが単一の辞書引き数と一緒に、フォーマット文字列でキーワードを使用できることを意味していることに注意してください。)

(強調鉱山)

しかし、文字列フォーマット演算子%thousand seperatorsをサポートしていません。

ただし、公式cookbookからレシピを適応させることができます:あなたはそれを介して4,000,000ボルトを入れた場合

import logging 

class Message(object): 
    def __init__(self, fmt, args): 
     self.fmt = fmt 
     self.args = args 

    def __str__(self): 
     return self.fmt.format(*self.args) 

class StyleAdapter(logging.LoggerAdapter): 
    def __init__(self, logger, extra=None): 
     super(StyleAdapter, self).__init__(logger, extra or {}) 

    def log(self, level, msg, *args, **kwargs): 
     if self.isEnabledFor(level): 
      msg, kwargs = self.process(msg, kwargs) 
      self.logger._log(level, Message(msg, args),(), **kwargs) 

logger = StyleAdapter(logging.getLogger(__name__)) 

def main(): 
    # this changed 
    logger.warning("this bird wouldn't voom if you put {:,} volts through it!", 4000000) 

if __name__ == '__main__': 
    logging.basicConfig(level=logging.DEBUG) 
    main() 

WARNING:__main__:この鳥はvoomないでしょう!

これは実際には"Use of alternative formatting styles"セクションの最後の例と同じように(メッセージを変更した)コピーされます。


個人的には私はあなたのformat(n, ',')ソリューションと一緒に行きます。それは完璧ではないかもしれませんが、異なる千セパレータを印刷するためにカスタムLoggerAdapterを設定する必要はありません。

+0

うわー、 'StyleAdapter'は本当に醜いです。保護された 'self.logger._log'にアクセスするのはクールではありません。私は回避策に固執すると思います。どうも! – wim

関連する問題