-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommand.py
63 lines (46 loc) · 1.54 KB
/
command.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""将命令和参数捆绑一起来供后续调用
总而言之,封装被用来执行一个动作或是触发一个事件的所有信息。
在Python生态系统中的例子:
Django HttpRequest (无 `execute` 方法):
https://docs.djangoproject.com/en/2.2/ref/request-response/#httprequest-objects
"""
import pathlib
class MoveFileCommand:
def __init__(self, src, dest):
self.src = src
self.dest = dest
def execute(self):
self.rename(self.src, self.dest)
def undo(self):
self.rename(self.dest, self.src)
def rename(self, src, dest):
print("renaming %s to %s" % (src, dest))
pathlib.Path(src).rename(dest)
def main():
"""
>>> import pathlib
>>> command_stacks = [
... MoveFileCommand("foo.txt", "bar.txt"),
... MoveFileCommand("bar.txt", "baz.txt"),
... ]
# 验证不存在所有的文件
>>> assert not pathlib.Path('foo.txt').exists()
>>> assert not pathlib.Path('bar.txt').exists()
>>> assert not pathlib.Path('baz.txt').exists()
# 创建空的文件
>>> open("foo.txt", "w").close()
# 后续可以执行的命令
>>> for cmd in command_stacks:
... cmd.execute()
renaming foo.txt to bar.txt
renaming bar.txt to baz.txt
# 也可以随意撤销
>>> for cmd in reversed(command_stacks):
... cmd.undo()
renaming baz.txt to bar.txt
renaming bar.txt to foo.txt
>>> pathlib.Path("foo.txt").unlink()
"""
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=True)