函数编程+文件处理+tag的用法+程序解耦
1 import os 2 3 def file_handler(backend_data, res=None, type=‘fetch‘): 4 if type == ‘fetch‘: 5 with open(‘haproxy.conf‘, ‘r‘) as read_f: 6 tag = False 7 ret = [] 8 for read_line in read_f: 9 if read_line.strip() == backend_data: 10 tag = True 11 continue 12 if tag and read_line.startswith(‘backend‘): 13 # tag=False 14 break 15 if tag: 16 print(‘\033[1;45m%s\033[0m‘ % read_line, end=‘‘) 17 ret.append(read_line) 18 return ret 19 elif type == ‘change‘: 20 with open(‘haproxy.conf‘, ‘r‘) as read_f, 21 open(‘haproxy.conf_new‘, ‘w‘) as write_f: 22 tag = False 23 has_write = False 24 for read_line in read_f: # server 25 if read_line.strip() == backend_data: 26 tag = True 27 continue 28 if tag and read_line.startswith(‘backend‘): 29 tag = False 30 if not tag: 31 write_f.write(read_line) 32 else: 33 if not has_write: 34 for record in res: 35 write_f.write(record) 36 has_write = True 37 os.rename(‘haproxy.conf‘, ‘haproxy.conf.bak‘) 38 os.rename(‘haproxy.conf_new‘, ‘haproxy.conf‘) 39 os.remove(‘haproxy.conf.bak‘) 40 41 def fetch(data): 42 # print(‘\033[1;43m这是查询功能\033[0m‘) 43 # print(‘\033[1;43m用户数据是\033[0m‘,data) 44 backend_data = ‘backend %s‘ % data 45 return file_handler(backend_data) 46 47 def add(): 48 pass 49 50 def change(data): 51 # print(‘这是修改功能‘) 52 # print(‘用户输入的数据是‘,data) 53 backend = data[0][‘backend‘] # 文件当中的一条记录 www.oldboy1.org 54 backend_data = ‘backend %s‘ % backend # backend www.oldboy1.org 55 # server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 56 57 old_server_record = ‘%sserver %s %s weight %s maxconn %s\n‘ % (‘ ‘ * 8, data[0][‘record‘][‘server‘], 58 data[0][‘record‘][‘server‘], 59 data[0][‘record‘][‘weight‘], 60 data[0][‘record‘][‘maxconn‘]) 61 62 new_server_record = ‘%sserver %s %s weight %s maxconn %s\n‘ % (‘ ‘ * 8, data[1][‘record‘][‘server‘], 63 data[1][‘record‘][‘server‘], 64 data[1][‘record‘][‘weight‘], 65 data[1][‘record‘][‘maxconn‘]) 66 print(‘用户想要修改的记录是‘, old_server_record) 67 res = fetch(backend) # fetch(‘www.oldboy1.org‘) 68 print(‘来自change函数--》‘, res) 69 if not res or old_server_record not in res: 70 return ‘你要修改的记录不存在‘ 71 else: 72 index = res.index(old_server_record) 73 res[index] = new_server_record 74 75 res.insert(0, ‘%s\n‘ % backend_data) 76 file_handler(backend_data, res=res, type=‘change‘) 77 78 def delete(): 79 pass 80 81 if __name__ == ‘__main__‘: 82 msg = ‘‘‘ 83 1:查询 84 2:添加 85 3:修改 86 4:删除 87 5:退出 88 ‘‘‘ 89 msg_dic = { 90 ‘1‘: fetch, 91 ‘2‘: add, 92 ‘3‘: change, 93 ‘4‘: delete, 94 } 95 96 while True: 97 print(msg) 98 choice = input(‘请输入你的选项:‘).strip() 99 if not choice: continue 100 if choice == ‘5‘: break 101 102 data = input(‘请输入你的数据:‘).strip() 103 104 if choice != ‘1‘: 105 data = eval(data) 106 107 res = msg_dic[choice](data) 108 print(‘最终结果是--》‘, res) 109 # 修改的格式:[{‘backend‘:‘www.oldboy1.org‘,‘record‘:{‘server‘:‘2.2.2.4‘,‘weight‘:20,‘maxconn‘:3000}},{‘backend‘:‘www.oldboy1.org‘,‘record‘:{‘server‘:‘2.2.2.5‘,‘weight‘:30,‘maxconn‘:4000}}]
模块的概念:一个.py文件称为一个模块(module)。
起源:由于程序代码越写越多,在一个文件里的代码就越来越长,越来越不容易维护。为了编写可维护的代码,就把很多函数分组,分别放到不同的文件夹里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。
模块的优点:
能够大大提高代码的可维护性。
同时,写代码可以不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们编程时也经常引用来自Python内置的模块和来自第三方的模块。
模块的分类:
python标准库
第三方模块
应用程序自定义模块
1、执行对应文件 2、引入变量名
这是调用程序
1 import calc 2 y = calc.add(3,5) 3 print(y) 4 #import 会先将调用文件运行一遍,再去调用其内部的函数 5 # test1 6 # test2 7 # 8
这是被调用程序
1 #store all functions, no calling 2 print("test1") 3 def add(x,y): 4 return x+y 5 def sub(x,y): 6 return x-y 7 print("test2")
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from calc import add 4 from calc import sub 5 y = add(3,5) #上面已经调用了,所以直接用函数 6 z = sub(3,5) 7 print(y) 8 print(z) 9 # 8 10 # -2
这种语句,可以用 import* 代表引入所有,但是不推荐
1 from calc import * #*代表所有 2 y = add(3,5) #上面已经调用了,所以直接用 3 z = sub(3,5) 4 print(y) 5 print(z) 6 # 8 7 # -2
1 import sys 2 print(sys.path) 3 # [‘D:\\PythonStudy\\Python全栈\\day21\\day21-lesson‘, -->执行文件所在的路径 4 # ‘D:\\PythonStudy\\Python全栈‘, 5 # ‘D:\\Program Files (x86)\\Python3.7\\python37.zip‘, 6 # ‘D:\\Program Files (x86)\\Python3.7\\DLLs‘, 7 # ‘D:\\Program Files (x86)\\Python3.7\\lib‘, 8 # ‘D:\\Program Files (x86)\\Python3.7‘, 9 # ‘D:\\Program Files (x86)\\Python3.7\\lib\\site-packages‘, 10 # ‘D:\\Program Files\\JetBrains\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend‘]
用from...import...语句调用当前路径级别同级或之下的任意模块
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
例如,一个abc.py
的文件就是一个名字叫abc
的模块,一个xyz.py
的文件就是一个名字叫xyz
的模块。
现在,假设我们的abc
和xyz
这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名。
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。
请注意,每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它的模块名就是对应包的名字。
多层包的调用
1 #多层之间用.隔开 2 from my_module.web.web2 import calc 3 from my_module.web.web2.calc import add
在执行文件调用是是__main__,在调用文件得到的是文件名
功能:1、用于被调用文件的测试 2、不想执行文件被他人调用
原文:https://www.cnblogs.com/jennifer224/p/12405110.html