分享
  1. 首页
  2. 主题
  3. Python

编写优雅代码的实现步骤

maiziedu · · 3860 次点击 · 开始浏览 置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

1.消除硬编码 第一个就是它有硬编码的情况,什么是硬编码,什么是硬编码就是说在代码里面,你用的一些变量它是写死的,比如说我们刚才调用connect APId的时候它的,ip地址端口用户名和密码都是我们写死的,什么192.168.3.106,用户名,密码,如果它的对端的这个端口它变了,或者说是密码用户名一般不会变。它的密码改变我们是不是要去修改代码,如果在实际工作中这样是非常不方便的,而且是有一定风险的,修改代码就意味着它可能是bug产生的边缘。所以说我们最好把这个可配置的代码,和变量分离开来。就是说消除硬编码的一个办法就是让它可配置。 2.异常捕捉 其次就是异常的捕捉,我们可以看到刚开始我们想列了,那个设置hot key机制时候,它调用connect方法,就抛出来一个sshaexception这个异常,但是我们并没有对它进行处理。这样的话就会在 实际的工作中它就非常的不好,甚至是有一些风险,因为不捕获这个异常的话,可能你的代码,就没办法在执行下去了,然后你写了这个软件可能就当掉了实际生产环境下,是一个非常严重的问题。 3.封装 另外就是进行一下封装,我们看到Paramiko它是对这个,它其实就是对ssh协议的一个封装,然而我们在实际的使用Paramiko的过程中,可以针对自己项目的需要。对它进行二次封装,就是说我封装成我们大家,一起,团队的人它更方便的使用它,甚至它可以不知道Paramiko这个的存在,而调用你封装的接口。来进行一个更方便的操作。 那我们就看实际的过程中我们是怎样来解决这几个问题的,首先就是消除硬编码的问题,我们引入另外一个ConfigParser这个库,ConfigParser就是可以把这个配置很方便的读进来。 config = ConfigParser.ConfigParser() 然后它有一个read的API就是读取文件。 那现在我们就一起来建立一个文件,叫做config.ini [ssh] host=192.168.3.105 port=22 usr=allen pwd=123 timeout=1.0 然后我们read这个config.ini config.read(‘config.ini’) 那么这些硬编码的地方,就可以换成对应的配置 client.connect(hostname= config.get(‘ssh’,’host’), port= config.getint(‘ssh’,’ port’), username= config.get(‘ssh’,’ username’), password= config.get(‘ssh’,’ password’), timeout= config.getfloat(‘ssh’,’ timeout’)) 我们可以来运行看一下 ![11.png](http://studygolang.qiniudn.com/161107/d496441d48b15273e29220a441ebe3d7.png) 这样我们把这些变量给替换成用这个配置来解析出来它实际的值。我们就是用这个ConfigParser来完成的,现在它运行的是非常的好,然后我们就把这些实际的参数给用配置给它隐藏起来,如果将来我们配置一旦更改的时候我们只需要更改这个config.ini就可以,然后我们来看一下,如何进行异常的捕获。 首先这个connect它会抛出这个异常的时候我们其实就应该用Python的try来捕获它,然后用这个except Exception,e:可以把异常给打印出来。 try: self.client.connect(hostname=self.host, port=self.port, username=self.usr, password=self.pwd, timeout=self.timeout) return True except Exception,e: print e 这个时候呢一旦开启的时候我们记得要把它给close掉。避免造成资源的浪费 self.client.connect(hostname=self.host, port=self.port, username=self.usr, password=self.pwd, timeout=self.timeout) return True except Exception,e: print 'caught ', e try: self.client.close() return False except: pass 其实这样的话就把这个,简单的看一下异常的捕获,其实这个地方抛出捕获的时候我们就在这把它给捕获了,其实这个exec_command它也是会抛出异常。 接下来我们就对它进行一个封装,如何封装,封装它是一个面向对象的一个特点,就会面向对象方法的一个特点,所以说我们把一些细节给隐藏起来,怎么隐藏呢,就是通过类。 我们可以新建一个ParamikoClient这个类。 class ParamikoClient: 然后其实我们在它的初始化函数中就可以把config这个文件名给传进来。 def __init__(self, ini_file): 然后就可以进行一些初始化的工作,这个config要变成main自身的变量,这个Client也是变成它的一个成员,这个类的对象的一个成员。 self. config= ConfigParser. ConfigParser () self. Config. read(' config.ini ') self. Client= paramiko.SSHClient() self. Client= set_missing_host_key_policy(paramiko.AutoAddPolicy()) 然后我们还可以,定义它的connect方法,connect方法的时候就可以把这部分全部,拷贝过来。 self.client.connect(hostname=self.host, port=self.port, username=self.usr, password=self.pwd, timeout=self.timeout) return True except Exception,e: print 'caught ', e try: self.client.close() return False except: pass 然后最终这样就可以最后我们在封装一个如何执行命令的 def run_command(self, cmd_str): stdin, stdout, stderr = self.client.exec_command(cmd_str) for line in stdout: print line 这样一个类我么我们就做好了我们在用这个类来建立一个ParamikoClient。 client = ParamikoClient('config.ini') 我们调用它的connect方法来接, client.connect() 然后 client.run_command('date') ![22.png](http://studygolang.qiniudn.com/161107/bcc5ea2323e4bb0b14f275c4db485c0d.png) 它把直接就把这个指令结果输出来了,我们还可以运行一下刚才输的查询远程机器的这个内存信息的指令。 client = ParamikoClient('config.ini') client.connect() client.run_command('cat/proc/meminfo') ![33.png](http://studygolang.qiniudn.com/161107/e7ccddc0e745efb45cd758dc9c04b0c6.png) 我们这样就看到到了这个从它编码,到进行一个更优雅实现的这么一个过程。 其实还有一个跟好的做法就是把这个ParamikoClient这个类单独放到一个文件里面,封装性会更好。 原文链接:http://www.maiziedu.com/wiki/frame/query/

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3860 次点击
1 回复 | 直到 2024年11月22日 10:38:34
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)