Python学习(十一)—— 程序解耦、模块、包

 文件的解耦

函数编程+文件处理+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('33[1;45m%s33[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('33[1;43m这是查询功能33[0m')
 43     # print('33[1;43m用户数据是33[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
' % (' ' * 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
' % (' ' * 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
' % 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}}]
View Code

模块

模块的概念:一个.py文件称为一个模块(module)。

起源:由于程序代码越写越多,在一个文件里的代码就越来越长,越来越不容易维护。为了编写可维护的代码,就把很多函数分组,分别放到不同的文件夹里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。

模块的优点:

  能够大大提高代码的可维护性。

  同时,写代码可以不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们编程时也经常引用来自Python内置的模块和来自第三方的模块。

模块的分类:

  python标准库

  第三方模块

  应用程序自定义模块

如何调用自定义模块:

import 

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")

from 文件名 import 函数名

 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

sys查找当前路径

 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...语句调用当前路径级别同级或之下的任意模块

临时修改环境变量(路径)

  sys.path.append()

1 import sys
2 print(sys.path)
3 sys.path.append(r'D:\PythonStudy\Python全栈\day21\day21-lesson')

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

例如,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名。

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。

请注意,每一个包目录下面都会有一个__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

补充:__name__

在执行文件调用是是__main__,在调用文件得到的是文件名

功能:1、用于被调用文件的测试 2、不想执行文件被他人调用

常见内置模块

time模块

random模块

login模块

json模块

os模块

re模块

原文地址:https://www.cnblogs.com/jennifer224/p/12405110.html