Python实现undo操作
Python实现UNDO日志操作
import re# 磁盘
Disk = {'A': 8,'B': 8,
}# 内存
Memory = {}# 缓冲区
T = 0# undo日志
log = []# 从磁盘读取到内存缓冲区
def INPUT(read_data):Memory[read_data] = Disk[read_data]# 从内存缓冲区读取到临时变量T
def READ(read_data, t):global TT = Memory[read_data]# 把临时变量T的值读入到内存缓冲区
def WRITE(write_data, t):# 再写入的时候 就把recover写入日志中log.append('<T,{},{}>'.format(write_data, Disk[write_data]))log.append('recover(\'{}\', {})'.format(write_data, Disk[write_data]))Memory[write_data] = T# 把内存缓冲区的内容放入磁盘中
def OUTPUT(write_data):Disk[write_data] = Memory[write_data]# undo日志恢复函数
def recover(key, value):Disk[key] = value# 打印当前动作 内存 磁盘 和 log
def print_now_status(ac):print('动作' + ' ' * 11 + 'T' + ' ' * 5 + '内存' + ' ' * 26 + '磁盘' + ' ' * 26 + 'LOG')print('{: <15s}{: <6d}{: <30s}{: <30s}{}'.format(ac, T, str(Memory)[1:-1], str(Disk)[1:-1], log))# 打印当前磁盘情况
def print_now_disk_status():print('磁盘数据 : ', str(Disk)[1:-1])# 打印当前日志内容
def print_now_log_status():print('日志数据 : ', log)# undo操作
def undo():print('■ 开始回退')while (len(log)):undo_cmd = log.pop()print('■ 执行指令 {}'.format(undo_cmd))if undo_cmd == '<START T>' or undo_cmd == '<COMMIT T>' or undo_cmd == '<T,A,8>' or undo_cmd == '<T,B,8>':breakexec(undo_cmd)para_list = re.search('\(.*?\)', undo_cmd).group().split()print('■ 回退变量 {} 到值 {}'.format(para_list[0], para_list[1]))print('■ 回退结束, 当前磁盘情况:')print_now_disk_status()print(' 当前日志情况:')print_now_log_status()# 定义事务类
class Transaction:# 初始化def __init__(self, df, cmd):self.define = dfself.command = cmd# 打印当前命令的指令def print_cmd(self):print('\n■ 事务 {} ■\n指令'.format(self.define))print('\n'.join(self.command) + '\n')def pause(self):print('执行哪个事务?')print('执行一步 : 按n | 执行完事务:按c | 从此步开始回滚 : 按u')c = input()print(c)while (c != 'n' and c != 'c' and c != 'u'):print('输入错误')c = input()print(c)return cdef excute(self):self.print_cmd()log.append('<START T>')can_pause = Truefor cmd in self.command:print('■ 执行动作 {}'.format(cmd))exc_cmd = cmdif '*' in cmd:exc_cmd = 'global T\n' + cmdexec(exc_cmd) # INPUT(\'A\') - > INPUT(A) | 'global T \n INPUT(A)'print_now_status(cmd)if can_pause:c = self.pause()if c == 'c':can_pause = Falseelif c == 'u':undo()returnlog.append('<COMMIT T>')print_now_log_status()def listFunction():print('■ 执行哪个事务?')print('■ 执行事务1 : 按1 ■ 查看事务1 : 按2 ■ 退出0 : 按0')c = input()while (c != '1' and c != '2' and c != '0'):print('输入错误')c = input()return cif __name__ == "__main__":# 定义事务df1 = 'A*=2, B*=2'command1 = ['INPUT(\'A\')', 'READ(\'A\', T)', 'T=T*2', 'WRITE(\'A\',T)', 'INPUT(\'B\')', 'READ(\'B\', T)', 'T=T*2','WRITE(\'B\',T)', 'OUTPUT(\'A\')', 'OUTPUT(\'B\')']Transaction1 = Transaction(df1, command1)print('初始磁盘情况')print_now_disk_status()c = listFunction()while (True):# 按输入指令执行c = int(c)if c == 1:Transaction1.excute()elif c == 2:Transaction1.print_cmd()elif c == 0:exit()if c == '1':print('事务执行完成')print('现在磁盘情况')print_now_disk_status()print('现在日志情况')print_now_log_status()c = listFunction()
Python实现undo操作相关推荐
- Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8
我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...
- Python 炫技操作:合并字典的七种方法
来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...
- Python OpenCV像素操作
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...
- python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...
创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...
- python 实现卷积操作
python实现卷积操作 调用tf.nn.conv2d()实现卷积 自己实现卷积函数 我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现 ...
- python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...
本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...
- python界面设置-PYTHON图形化操作界面的编程七__创建菜单
PYTHON图形化操作界面的编程七__创建菜单 十八.创建菜单 1.水平菜单的创建 创建菜单需要多条语句,所以这里通过实例来说明水平菜单的创建方法: 下面的语句可以在窗口中添加水平菜单,其中前四行语句 ...
- python与excel做数据可视化-Python的Excel操作及数据可视化
Excel表操作 python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 安装xlrd pip install xlrd 简单的表格读取 ...
- python切片语法-Python字符串切片操作知识详解
python 中关于字符串切片的一个问题 aa[0:6] 表示取 第0,1,2,3,4,5 位的数据 所以是6个 123456 aa[:-1] 表示取开始到倒数第二位的数据 所以也是123456 就像 ...
最新文章
- 机器翻译引擎的基本原理 ——LSTM
- python下载地址 windows
- python网络爬虫实战 吕文翔_实战Python网络爬虫
- kylin3.x安装,解决load hive表的时候提示shaded-guava问题
- 深入理解java虚拟机(十三) Java 即时编译器JIT机制以及编译优化
- pythonuiautomator2教程_UIAutomator2 + Python 入门使用总结
- 多线程编程(三)--创建线程之Thread VS Runnable
- 煮饭的机器人作文_公示|“笔随我心、心由笔动”作文大赛获奖名单
- mysql怎么跳出while循环_mysql while,loop,repeat循环,符合条件跳出循环
- php mysql实现下拉列表查询_php mysql如何实现通过下拉框查询显示数据库中的数据...
- HR搬程序员椅子拍老板马屁,开怼的程序员被开?
- JavaScript学习(九十三)—选择排序和冒泡排序
- Acunetix Web Vulnarability Scanner V10.5 详细中文手册
- 计算机操作员评分标准,计算机操作员EXCEL操作竞赛样卷与评分标准.doc
- python 矩阵对应元素相乘,python 矩阵对应元素相乘_Numpy——numpy的基本运算
- U盘拷贝大文件提示文件过大无法拷贝怎么解决
- Codeforces Round #739 (Div. 3) E. Polycarp and String Transformation
- JavaScript/DHTML代码
- Unittest-单元测试3
- c语言kbhit函数头文件,c - 有没有办法替换标准C中的kbhit()和getch()函数? - 堆栈内存溢出...