2021年3月6日 星期六

[Python] 修改 builtin function 行為

markdown 遇到一個需求是,需要修改 python print function 的行為,讓每一次 print 呼叫之後都立即 flush。查到 python 有一個 [partial function](https://docs.python.org/3/library/functools.html) 可以修改 print 的行為。
from functools import partial
print = partial(print, flush=True)

import my_module
原本以為只要將程式放到 import 之前,就可以影響到之後 import 的 module,但是發現沒有作用,這是因為 partial 的作用域只有在執行 partial 的該 module 內,無法影響到其它 module。後來發現 python 有個 builtin module,所有內建的函式都在裡面,我們在呼叫內建的函式時,最後都是參考到 builtin module,就想是不是可以直接替換掉 builtin module 內的 print 函式,一試果然就成功了。
import builtins
from functools import partial
builtins.print = partial(print, flush=True)

import my_module
替換掉 builtin 內的 print 後,之後所有呼叫的 print,不管是在哪個 module,都會參考到新函式,真是很方便。 --- * [Everything in Python is mutable](https://faster-cpython.readthedocs.io/mutable.html)

沒有留言:

張貼留言