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操作相关推荐

  1. Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8

    我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...

  2. Python 炫技操作:合并字典的七种方法

    来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...

  3. Python OpenCV像素操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...

  4. python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  5. python 实现卷积操作

    python实现卷积操作 调用tf.nn.conv2d()实现卷积 自己实现卷积函数 我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现 ...

  6. python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...

    本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...

  7. python界面设置-PYTHON图形化操作界面的编程七__创建菜单

    PYTHON图形化操作界面的编程七__创建菜单 十八.创建菜单 1.水平菜单的创建 创建菜单需要多条语句,所以这里通过实例来说明水平菜单的创建方法: 下面的语句可以在窗口中添加水平菜单,其中前四行语句 ...

  8. python与excel做数据可视化-Python的Excel操作及数据可视化

    Excel表操作 python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 安装xlrd pip install xlrd 简单的表格读取 ...

  9. python切片语法-Python字符串切片操作知识详解

    python 中关于字符串切片的一个问题 aa[0:6] 表示取 第0,1,2,3,4,5 位的数据 所以是6个 123456 aa[:-1] 表示取开始到倒数第二位的数据 所以也是123456 就像 ...

最新文章

  1. 机器翻译引擎的基本原理 ——LSTM
  2. python下载地址 windows
  3. python网络爬虫实战 吕文翔_实战Python网络爬虫
  4. kylin3.x安装,解决load hive表的时候提示shaded-guava问题
  5. 深入理解java虚拟机(十三) Java 即时编译器JIT机制以及编译优化
  6. pythonuiautomator2教程_UIAutomator2 + Python 入门使用总结
  7. 多线程编程(三)--创建线程之Thread VS Runnable
  8. 煮饭的机器人作文_公示|“笔随我心、心由笔动”作文大赛获奖名单
  9. mysql怎么跳出while循环_mysql while,loop,repeat循环,符合条件跳出循环
  10. php mysql实现下拉列表查询_php mysql如何实现通过下拉框查询显示数据库中的数据...
  11. HR搬程序员椅子拍老板马屁,开怼的程序员被开?
  12. JavaScript学习(九十三)—选择排序和冒泡排序
  13. Acunetix Web Vulnarability Scanner V10.5 详细中文手册
  14. 计算机操作员评分标准,计算机操作员EXCEL操作竞赛样卷与评分标准.doc
  15. python 矩阵对应元素相乘,python 矩阵对应元素相乘_Numpy——numpy的基本运算
  16. U盘拷贝大文件提示文件过大无法拷贝怎么解决
  17. Codeforces Round #739 (Div. 3) E. Polycarp and String Transformation
  18. JavaScript/DHTML代码
  19. Unittest-单元测试3
  20. c语言kbhit函数头文件,c - 有没有办法替换标准C中的kbhit()和getch()函数? - 堆栈内存溢出...

热门文章

  1. 维天运通冲刺香港上市获证监会反馈,需补充说明增资定价依据等
  2. vue3使用element组件中的Image导致频闪
  3. 成都大学计算机图形学期末考试题,计算机图形学期末考试题
  4. 60个实用Android框架排行榜
  5. 了解一下iframe页面嵌入使用,轻松实现页面集成
  6. 复旦java_复旦大学
  7. AI中怎么给文字加粗
  8. 计算机画大熊猫教案,三年级上册信息技术教案-第2课 画大熊猫|冀教版 (1)
  9. 异常代码c0000005
  10. java单元测试读文件数据_如何将文本文件资源读入Java单元测试?