2017-02-08 79 views
1

我喜歡Python的print功能的接口:爲什麼python的日誌界面與打印界面不同?

print("abc %d %s" % (12, "sdf"), 78, "some other string") 

但是,當我使用的默認logging包登錄界面不同的是:

logger.info("abc %d %s 78 some other string", 12, "sdf") 

是否有任何理由,他們都不一致?是否有可能獲得logginglogger表現print -like?

+1

記錄器函數的優點是,如果未啓用記錄'info',則結果字符串(插入所有替換)甚至不需要計算(如果有非常複雜的日誌消息可能會影響性能)。 – khelwood

+0

您仍然可以使用'%'操作符,它與打印無關。正如khelwood所解釋的那樣,只是建議讓日誌記錄方法爲你做。所以你只是錯過了自動空間分離,這是一個非常小的事情。您無法更改它 –

+0

@AlexHall是正確的。你可以編寫你自己的包裝函數來獲得自動空間分離:'def log_info(logger,* args):logger.info(''.join(args) – Darthfett

回答

2

TL; DR:讓記錄器格式化消息而不是自己格式化它有一些優點。對於print沒有這樣的優點,所以最好有更方便的界面。

您看到的第一件事是功能簽名是不同的。 print函數接受任意多個位置參數,並將它們全部打印出來。在你的例子中,你發送了3個位置參數來打印,並且它們被一個空格連接起來。

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) 

記錄器功能接受郵件一個位置參數,以及任意多個模板變量在消息替代,例如:

logger.info(msg, *args, **kwargs) 

是否有任何理由,他們都不一致?

是的。這裏print只是一個函數,和其他函數一樣,參數在函數參數被調用之前完全評估。所以,模板"abc %d %s" % (12, "sdf")首先發生。

另一方面,使用記錄器最好讓記錄器進行模板/格式化。這有幾個原因,但也許最有說服力的是日誌聚合服務可以很容易地將相同類型的錯誤組合在一起。由不同參數觸發的同一模板中的這些錯誤可視爲一個整體 - 而不是產生數千個單獨的錯誤。