1
0
mirror of https://github.com/apachecn/lmpythw-zh.git synced 2025-05-28 12:02:19 +00:00
lmpythw-zh/ex29.md
wizardforcel 128d1cdb10 ex28
2017-08-11 18:21:02 +08:00

58 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 练习 29`diff`和`patch`
> 原文:[Exercise 29: diff and patch](https://learncodethehardway.org/more-python-book/ex29.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
为了完成第四部分,你将简单把你所学习的完整的 TDD 流程,应用于你可能不熟悉的、更相关的项目。请参阅练习 28 来确认你了解该流程,并确保你严格遵循它。如果必须的话,创建一个检查列表。
> 警告
> 当你实际工作时,这个严格的流程完全没有用。目前,你正在研究该流程,并将其内在化,以便你可以在现实世界中使用它。这就是为什么我让你严格遵循它。这只是练习,所以当你做真正的工作时,不要成为一个狂热者。这本书的目的是,教你一套完成工作的策略,而不是教你一个可以传播给大众的宗教仪式。
## 挑战练习
`diff`命令接受两个文件并产生第三个文件(或输出),它包含第一个文件与第二个文件相比,修改的东西。它是`git`和其它版本控制工具的基础。在 Python 中实现`diff`是相当简单,因为有一个库可以为你做这件事,所以你不需要处理算法(这可能非常复杂)。
`patch `工具是`diff`工具的伙伴,因为它需要一个差异文件,并将其应用到另一个文件,来产生第三个文件。这可以让你选取在两个文件中的更改,运行`diff`来仅仅生成差异,然后将该`.diff`文件发送给某人。那个人可以使用他们的原始文件副本和`.diff`,使用`patch`来重建你的更改。
以下是一个工作流程示例,来演示`diff``patch`的工作原理。我有两个文件`A.txt``B.txt``A.txt文件包含一些简单的文字然后我复制它并创建`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
```
这产生了文件`AB.diff`,它拥有`A.txt`与`B.txt`相比的变化,你可以看到这是在修复我打破的押韵。一旦你有了`AB.diff`,你可以使用补丁应用更改:
```
$ patch A.txt AB.diff
$ diff A.txt B.txt
```
最后的命令应该不显示认识输出,因为之前的`patch`命令使`A.txt`与`B.txt`具有相同的内容。
这两个东西的实现,应该从`diff`命令开始,因为使用 Python 来作弊,你有完全实现的`diff`。你可以在`difflib`文档的末尾找到它,但尝试实现你的版本,并看看与之相比怎么样。
这个练习的真正要点就是`patch`工具Python 没有为你实现它。你将要阅读`difflib`中的`SequenceMatcher`类,并特别查看`SequenceMatch.get_opcodes`函数。这是你`patch`工作的唯一线索,但这是一个非常好的线索。
## 研究性学习
你能把这种`diff`和`patch`的组合做到什么程度?你可以将它们组合成一个工具吗?你可以让他们像微型的`git`那样工作吗?
## 深入学习
找到尽可能多的差异比较算法。另一件需要研究的事情是`git`的工作方式。