標籤:

Log to a file without modifying code, with just one line

寫程序時經常遇到這樣一個場景:某些中間變數需要打出來看看對不對。假設既不用 IDE 又不用 pdb,最快的方法當然是直接 print() 了。如果你想保存這些輸出,或是對輸出做進一步處理,比如搜索該出現的字元串,一般的做法是 redirect 到文件:

$ python yourcode.py > tmp.log

但這樣有個問題:要麼不導出,要麼全導出。如果你只想導出一部分到文件,怎麼辦?

用 logging 嗎?嫌麻煩。

print 加上 file 參數呢?倒是可以,不過每個 print 都加也很麻煩。

就不能簡單點嗎,比如添加一行代碼,把某個函數或代碼段內的 print 輸出存到文件?

因為覺得需要這個功能,所以就寫了一個:github.com/laike9m/f

用起來實在太簡單了,沒有任何學習成本。

  • 一行代碼把函數內的 print 輸出存入文件:

import f@f # 把 print() 的輸出存入 tmp.log,文件打開模式為 wdef inner(): print(whatever)

  • 指定文件名和打開模式:

# 把 print() 的輸出存入 important.log,文件打開模式為 a@f(filename=important.log, mode=a)def inner(): print(whatever)

  • 上下文管理器這麼好用,我們怎麼能不支持?

with f: print(whatever)with f(filename=important.log, mode=a): print(whatever)

  • 想同時輸出到文件和控制台,當然也沒問題:

@f(filename=important.log, mode=a, stdout=True)def inner(): print(whatever)with f(filename=important.log, mode=a, stdout=True): print(whatever)

目前已經可用,雖然很多場景下的測試並不充分,代碼寫得也不夠漂亮。如果遇到問題,歡迎提 issue 和 pr。

推薦閱讀:

爬蟲帶你逛知乎(下篇)
黃哥分析如何用python解決特殊文本文件問題
如何看待將Python代碼轉換成Go代碼並進一步編譯的 Grumpy 項目?
Python函數的參數列表中嵌套格式『[ [, [, ]]]』該如何理解,和一般的位置參數表示的區別有哪些?

TAG:编程 | Python |