一日一技:如何讓自己的工具函數在Python全局可用?
我們在開發Python項目的時候,經常會寫一些工具函數。為了在項目里面多個.py文件中使用這個工具函數,就不得不在多個地方都導入它,非常麻煩。
例如下面這個例子:
在A.py和C.py?文件都要使用clean_msg?這個工具函數,那么他們就都要從util.py?中導入clean_msg。這似乎理所當然。
但今天我在看icecream/builtins.py[1]源代碼的時候,突然發現了一個高級用法,可以讓我們使用工具函數的時候,就像使用Python的print函數一樣,不用導入,而是直接使用。
我們先來看看效果:
大家注意A.py和C.py?,我并沒有導入clean_msg而是直接使用了這個函數。并且運行完全正常。
關鍵原理就在入口文件main.py,被我框住的3行:
import builtins
from util import clean_msg
setattr(builtins, 'clean_msg', clean_msg)
在Python里面,所有內置的函數或者類都在builtins?模塊中,因此在代碼里面可以直接使用而不用導入?,F在只需要把我們自定義的工具函數注冊到builtins模塊中,就能讓它跟內置函數有相同的效果。
如果想把一個工具函數注冊成為內置函數,只需要在入口文件中導入它,然后使用setattr?把它設置成builtins模塊的一個屬性。第二個參數是你想全局調用的時候的名字,第三個參數就是你需要注冊的工具函數。名字可以跟工具函數的名字不相同,只要不跟已有的內置函數重復就好了。
注冊完成以后,在這個項目的整個運行時中,任何.py文件里面都可以直接通過注冊的名字調用這個工具函數,就跟調用內置函數一樣。
參考資料
[1] icecream/builtins.py: https://github.com/gruns/icecream/blob/master/icecream/builtins.py?