• 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模块

  • 相关阅读:
    维特比(Viterbi)算法解最优状态序列
    c#重要知识点复习1---程序流程控制
    学C# Hook原理及EasyHook简易教程
    EmguCV 绘画图形
    EmguCV创建/保存图片
    EmguCV中图像类型进行转换
    basler 相机拍照简单类综合Emgu.CV---得到图档--原创
    RotatedRect 类的用法
    EmguCv“线段” 结构类型学习
    aforge 学习-基本图像处理要用的类库
  • 原文地址:https://www.cnblogs.com/jennifer224/p/12405110.html
Copyright © 2020-2023  润新知