瞭解過編程的人應該對函數重寫 ( override ) 不陌生,但其實,這個普適的方法並不適用於全部的應用場景。舉個簡單的例子,當多個項目代碼貢獻方都想參與同一程序的修改時,頻繁的函數重寫會使代碼變得異常混亂,讓整個項目變得難以維護。python
那麼,有沒有更優雅的方法可以兼顧代碼的擴展性與穩定性呢?編程
有的,pytest ( python 單元測試框架 ) 的做者就意識到了這個問題。在其源碼中,能夠發現許多通過 @pytest.hookimpl 關鍵字裝飾的函數,這表明這個函數是一個插件的實現,其做用是經過用插件調用的形式來替代函數重寫。。windows
pytest 部分源碼:app
@pytest.hookimpl(hookwrapper=True)
def pytest_load_initial_conftests(early_config: Config):
ns = early_config.known_args_namespace
if ns.capture == "fd":
_py36_windowsconsoleio_workaround(sys.stdout)
_colorama_workaround()
_readline_workaround()
pluginmanager = early_config.pluginmanager
capman = CaptureManager(ns.capture)
pluginmanager.register(capman, "capturemanager")
# make sure that capturemanager is properly reset at final shutdown
early_config.add_cleanup(capman.stop_global_capturing)
# finally trigger conftest loading but while capturing (issue93)
capman.start_global_capturing()
outcome = yield
capman.suspend_global_capture()
if outcome.excinfo is not None:
out, err = capman.read_global_capture()
sys.stdout.write(out)
sys.stderr.write(err)
複製代碼
早前在 pytest 中這只是一個插件工具庫,而隨着這個庫的日益發展, 做者把它從 pytest 中分離了出來,並將其命名爲了 pluggy。框架
今天的學習內容是要用 pluggy 把當前項目裏的類和函數轉變爲插件,來代替函數重寫。ide
預估賞金:約 1500 人民幣。函數
通常在開始工做前須要將任務進行拆解,劃分紅數個小任務。而這個任務,基本能夠劃分爲如下三步:工具
因而在一頓廢寢忘食的編碼後......單元測試
任務實際耗時在 15 個小時左右。學習
任務進行過程當中,發現寫代碼並非最難的,難的是如何將當前項目的代碼結構插件化。過去的固化編碼思惟讓我很難短期想明白並做出實踐。大概在作了一、2次代碼重構,推翻了1次原有代碼後,才終於完成了這個任務。
有時候代碼思惟比代碼更加劇要。十分感謝此次學習讓我深入理解了編程的另外一種可能性。
期待下一個學習任務,也歡迎想要一塊兒學習的小夥伴多多交流。