Python全栈day21(函数的解耦)
针对上一篇对文件的操作程序,执行一次操作的函数查询,添加,修改,删除都需要在函数里面定义文件处理的过程,整体函数看起来比较乱,代码重复过多
下面新定义一个函数专门用于处理文件操作,然后在不同的函数里面调用该函数
这种方法称为解耦
day21-2.py
#定义针对文件操作的函数把文件操作单独出来,通过type区分根据不同的调用方式处理不同的事情
def file_handler(backend_data,res=None,type='fetch'):
if type == 'fetch':
# 以只读方式打开文件如果遇到对应的关键行,这里的关键行是 backend www1则把标签置为True
# 需要输出的是关键行和下一个关键行之间的数据,所以假如循环到下一个以backend开头的关键字则退出整个循环
# 假如遇到查询的关键行并且还没有遇到下一个以backend开头的关键行则tag值为True打印两行之间的数据
# 并且把数据追加到列表中作为返回值返回
with open('test.conf', 'r') as read_f:
tag = False
ret = []
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
break
if tag:
print(read_line, end='')
ret.append(read_line)
return ret
# 以只读方式打开文件test.conf以写方式打开新文件test.conf_new并且定义两个补签tag和has_write
# tag补签用来识别是直接写原文件内容还是写新列表内容
# has_write补签用来识别列表内容是否已经写过一遍了,如果已经写过一遍就无需重复写入了
elif type == 'add':
with open('test.conf', 'r') as read_f, open('test.conf_new', 'w') as wirte_f:
tag = False
has_write = False
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if read_line.startswith('backend'):
tag = False
if not tag:
wirte_f.write(read_line)
else:
if not has_write:
for record in res:
wirte_f.write(record)
has_write = True elif type == 'change':
with open('test.conf', 'r') as read_f, open('test.conf_new', 'w') as write_f:
tag = False
has_write = False
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
tag = False
if not tag:
write_f.write(read_line)
else:
if not has_write:
for record in res:
write_f.write(record)
has_write = True elif type == 'delete':
with open('test.conf', 'r') as read_f, open('test.conf_new', 'w') as write_f:
tag = False
has_write = False
for read_line in read_f:
if read_line.strip() == backend_data:
tag = True
continue
if tag and read_line.startswith('backend'):
tag = False
if not tag:
write_f.write(read_line)
else:
if not has_write:
for record in res:
write_f.write(record)
has_write = True def fetch(data):
print('这是查询函数,用户的输入是%s' %data) #data = 'www1'
backend_data = 'backend %s' %data #backend_data = 'backend www1'
return file_handler(backend_data) def add(data):
print('这是添加函数,用户输入的数据是%s' %data) #data = [{'backend':'www1','server':'3'}]
backend = data[0]['backend'] # backend = 'www1'
backen_data = 'backend %s' % backend # backend_data = 'backend www1'
res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n']
add_server_record = '%sserver %s\n' %(' '*4,data[0]['server']) #add_server_record = ' server 3\n'
if not res:
print('修改的数据不存在')
elif add_server_record in res:
print('需要修改的数据重复')
else:
res.insert(-1,add_server_record) #res = [' server 1\n', ' server 2\n', ' server 3\n','\n']
res.insert(0,'%s\n' %backen_data) #res = ['backend www1\n',' server 1\n', ' server 2\n', ' server 3\n','\n']
file_handler(backen_data,res=res,type='add') def change(data):
#data是一个特定格式的列表,前面包含了需要修改的旧数据的一个字典,后面包含了需要改成什么的字典
#因为input接收输入格式为字符串所以需要在输入数据的时候判定之前输入的选项如果不是1查询功能则需要把字符串通过eval函数方法转换成列表格式
print('这是修改函数,用户输入的数据是%s' % data) #data = [{'backend':'www1','server':'1'},{'backend':'www1','server':'3'}]
#根据列表及字典索引取出需要查询的关键字www1 作为查询函数fetch的参数
backend = data[0]['backend'] #backend = 'www1'
#根据需要查询的关键字加backend拼接出关键行
backend_data = 'backend %s' %backend #backend_data = 'backend www1'
#根据取出的关键字www1查询并且把结果返回给一个列表res 这个列表作为一会修改时需要写入文件的以后列表
res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n']
#根据用户输入取出需要修改的旧数据和需要修改成什么的新数据,需要加换行符\n
old_server_record = '%sserver %s\n' %(' '*4,data[0]['server']) #old_server_record = ' server 1\n'
new_server_record = '%sserver %s\n' %(' '*4,data[1]['server']) #old_server_record = ' server 3\n'
#判断调用查询函数fetch返回的列表res是否为空以及需要修改的旧数据是否在列表中,如果其中一条不成立及返回数据不存在
if not res or old_server_record not in res:
print('需要修改的数据不存在')
#如果满足以上条件res有返回值并且修改的旧数据在res里面则先找出就数据的索引然后根据索引把旧数据替换成需要修改的新数据
#因为res没有返回关键行的数据所以需要把关键行插入列表res中
else:
index = res.index(old_server_record) #index=0
res[index] = new_server_record #res = [' server 3\n', ' server 2\n', '\n']
res.insert(0,'%s\n' %backend_data) #res = ['backend www1\n',' server 3\n', ' server 2\n', '\n'] file_handler(backend_data,res=res,type='change') def delete(data):
print('这是删除函数,用户输入的数据是%s' %data) #data = [{'server': '1', 'backend': 'www1'}]
backend = data[0]['backend'] # backend = 'www1'
backen_data = 'backend %s' % backend # backend_data = 'backend www1'
res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n']
del_server_record = '%sserver %s\n' % (' ' * 4, data[0]['server']) # del_server_record = ' server 1\n'
if not res or del_server_record not in res:
print('需要删除的内容不存在')
else:
res.remove(del_server_record) #res = [' server 2\n', '\n']
res.insert(0, '%s\n' % backen_data) #res = ['backend www1\n',' server 2\n', '\n']
file_handler(backen_data,res=res,type='delete') if __name__ == '__main__':
#定义需要显示的信息
msg = '''
1:查询
2:添加
3:修改
4:删除
5:退出
'''
#定义一个字典根据用户输入的选项以及输入的数据执行对应操作
msg_dic={
'1': fetch,
'2': add,
'3': change,
'4': delete
}
while True:
print(msg)
choice = input('请输入选项:')
#如果输入为空则退出本次循环重新输入
if choice == '':continue
#如果输入为5则退出程序
if choice == '5':break
data = input('请输入数据:')
#如果不是选项1执行操作则需要把输入的字符串类型转换成对应的列表类型
if choice != '1':
data = eval(data)
#根据用户输入的choic和data数据执行对应的函数
res = msg_dic[choice](data)
print('最终返回结果是%s' % res)
Python全栈day21(函数的解耦)的更多相关文章
- Python全栈day21(调用模块路径BASEDIR的正确方法)
正常写python程序会有一个可执行的bin.py文件,假如这个文件需要导入my_module里面定义的模块,应该怎么设置sys.path 文件夹目录结构如下,因为bin不在与my_module同级目 ...
- Python全栈day21(作业针对一个文件进行查询修改删除的操作练习)
需求,有一个配置文件test.conf内容如下 backend www1 server 1 server 2 backend www2 server 3 server 4 add [{'backend ...
- python全栈开发 生成器 :生成器函数,推导式及生成器表达式
python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...
- python全栈开发之匿名函数和递归函数
python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...
- 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】
点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
随机推荐
- 一个表空间offline后alert日志报ORA-01135 和ORA-01110的问题
本文是原创文章.转载请注明出处:http://blog.csdn.net/msdnchina/article/details/44336789 近期遇到一个案例,是将一个表空间offline之后,al ...
- jQuery 效果 - slideToggle() 方法
实例 通过使用滑动效果,在显示和隐藏状态之间切换 <p> 元素: $(".btn1").click(function(){ $("p").slide ...
- 巨头们的GitHub仓库整理
1.Google >1.Google >https://github.com/google >2.Google Samples https://github.com/googlesa ...
- 清除Css中select的下拉箭头样式
select {/*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/border: solid 1px #000; /*很关键:将默认的select选择框样式清除*/appeara ...
- HeadFirst Jsp 09 (JSTL)
JSTL (jsp standard tag library) 标准标记库 JSTL 安装, 注意你的每一个项目都需要一个 JSTL副本, 并把它放在WEB-INF/lib 目录下, 在 Tomcat ...
- java基础知识小小结
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- SQL on Hadoop 的真相(2)
转自:http://blog.jobbole.com/87159/ 这是一组系列博客,目的是详尽介绍 SQL-on-Hadoop .该系列的第一篇会介绍一些存储引擎和在线事务处理(简称 OLTP )相 ...
- Boosting with Abstention
论文提出了一种loss: x是原始数据,y是对应的label,h(x)是一个判别函数,r(x)相当于训练了一个信心函数,r(x)越大,代表对自己做的判断的信息越大,当r(x)<0的时候,就拒绝进 ...
- java 多线程 1 “常用的实现多线程的2种方式”:Thread 和 Runnable
转载系列自http://www.cnblogs.com/skywang12345/p/java_threads_category.html 当使用第一种方式(继承Thread的方式)来生成线程对象时, ...
- 小结:bfs
概要: 我们在初始状态要到达终止状态可以沿着同深度的向下搜索,这样范围覆盖更广,在解的深度较小的时候十分适用. 技巧及注意: 所有状态在转移后如果要打标记一定要在进队列前打!不要在出队列才打!否则就是 ...