笨辦法學(xué) Python · 續(xù) 練習(xí) 29:`diff`和`patch`

練習(xí) 29:diffpatch

原文:Exercise 29: diff and patch

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

為了完成第四部分,你將簡單把你所學(xué)習(xí)的完整的 TDD 流程,應(yīng)用于你可能不熟悉的、更相關(guān)的項(xiàng)目。請參閱練習(xí) 28 來確認(rèn)你了解該流程,并確保你嚴(yán)格遵循它。如果必須的話,創(chuàng)建一個(gè)檢查列表。

警告

當(dāng)你實(shí)際工作時(shí),這個(gè)嚴(yán)格的流程完全沒有用。目前,你正在研究該流程,并將其內(nèi)在化,以便你可以在現(xiàn)實(shí)世界中使用它。這就是為什么我讓你嚴(yán)格遵循它。這只是練習(xí),所以當(dāng)你做真正的工作時(shí),不要成為一個(gè)狂熱者。這本書的目的是,教你一套完成工作的策略,而不是教你一個(gè)可以傳播給大眾的宗教儀式。

挑戰(zhàn)練習(xí)

diff命令接受兩個(gè)文件并產(chǎn)生第三個(gè)文件(或輸出),它包含第一個(gè)文件與第二個(gè)文件相比,修改的東西。它是git和其它版本控制工具的基礎(chǔ)。在 Python 中實(shí)現(xiàn)diff是相當(dāng)簡單,因?yàn)橛幸粋€(gè)庫可以為你做這件事,所以你不需要處理算法(這可能非常復(fù)雜)。

patch工具是diff工具的伙伴,因?yàn)樗枰粋€(gè)差異文件,并將其應(yīng)用到另一個(gè)文件,來產(chǎn)生第三個(gè)文件。這可以讓你選取在兩個(gè)文件中的更改,運(yùn)行diff來僅僅生成差異,然后將該.diff文件發(fā)送給某人。那個(gè)人可以使用他們的原始文件副本和.diff,使用patch來重建你的更改。

以下是一個(gè)工作流程示例,來演示diffpatch的工作原理。我有兩個(gè)文件A.txtB.txtA.txt文件包含一些簡單的文字,然后我復(fù)制它,并創(chuàng)建B.txt`,帶有一些修改:

$ diff A.txt B.txt > AB.diff
$ cat AB.diff
2,4c2,4
< her fleece was white a mud
< and every where that marry
< her lamb would chew cud
---
> her fleece was white a snow
> and every where that marry went
> her lamb was sure to go

這產(chǎn)生了文件AB.diff,它擁有A.txtB.txt相比的變化,你可以看到這是在修復(fù)我打破的押韻。一旦你有了AB.diff,你可以使用補(bǔ)丁應(yīng)用更改:

$ patch A.txt AB.diff
$ diff A.txt B.txt

最后的命令應(yīng)該不顯示認(rèn)識(shí)輸出,因?yàn)橹暗?code>patch命令使A.txtB.txt具有相同的內(nèi)容。

這兩個(gè)東西的實(shí)現(xiàn),應(yīng)該從diff命令開始,因?yàn)槭褂?Python 來作弊,你有完全實(shí)現(xiàn)的diff。你可以在difflib文檔的末尾找到它,但嘗試實(shí)現(xiàn)你的版本,并看看與之相比怎么樣。

這個(gè)練習(xí)的真正要點(diǎn)就是patch工具,Python 沒有為你實(shí)現(xiàn)它。你將要閱讀difflib中的SequenceMatcher類,并特別查看SequenceMatch.get_opcodes函數(shù)。這是你patch工作的唯一線索,但這是一個(gè)非常好的線索。

研究性學(xué)習(xí)

你能把這種diffpatch的組合做到什么程度?你可以將它們組合成一個(gè)工具嗎?你可以讓他們像微型的git那樣工作嗎?

深入學(xué)習(xí)

找到盡可能多的差異比較算法。另一件需要研究的事情是git的工作方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容