編程兼職驅動學習 - pluggy

背景

瞭解過編程的人應該對函數重寫 ( 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 人民幣。函數

任務拆解

通常在開始工做前須要將任務進行拆解,劃分紅數個小任務。而這個任務,基本能夠劃分爲如下三步:工具

  • 1.理解插件的概念與設計;
  • 2.學習 pluggy 的使用;
  • 3.將目標類轉化爲插件。

因而在一頓廢寢忘食的編碼後......單元測試

任務回顧

任務實際耗時在 15 個小時左右。學習

任務進行過程當中,發現寫代碼並非最難的,難的是如何將當前項目的代碼結構插件化。過去的固化編碼思惟讓我很難短期想明白並做出實踐。大概在作了一、2次代碼重構,推翻了1次原有代碼後,才終於完成了這個任務。

有時候代碼思惟比代碼更加劇要。十分感謝此次學習讓我深入理解了編程的另外一種可能性。

期待下一個學習任務,也歡迎想要一塊兒學習的小夥伴多多交流。

相關文章
相關標籤/搜索