51Testing软件测试论坛

标题: 奇妙的上下文管理器 [打印本页]

作者: ufoofuufoofu    时间: 2024-9-27 10:52
标题: 奇妙的上下文管理器
      python中操作文件、会话、网页之类的通常需要一个资源句柄,它通常通过对应的类初始化来申请相应的资源,又在使用完成后通过close或logout之类的操作手动释放资源,对于新手而言经常由于忘记释放这些资源导致系统卡死或故障。为解决这一问题,python引入了with语法,通过该语法可以自动实现资源的管理和自动释放,其背后其实是使用了上下文管理器,除了with我们也可以通过调用contextlib中的contextmanager来实现这一功能,比如下面的代码,通过加入@contextmanager魔术字来实现资源的自动管理与释放。
  1. @contextmanager
  2. def g_login(ip,port=22,user='root',pwd='root'):
  3.     conn = SSHclient() if port==22 else TelnetClient()
  4.     try:
  5.         if conn.login(ip,port,user,pwd):
  6.             print('login %s success'%ip)           
  7.            yield conn
  8.         except Exception as e:
  9.             print('login %s fail:%s'%(ip,e))
  10.         finally:
  11.             conn.logout()
  12.     print('logout %s'%ip)
复制代码
那么,即然with是用来管理上下文资源的,是否支持多层㠌套调用呢?当然可以,如下代码
  1. def test_cardop():
  2.     with g_login('10.18.1.1',22,'root','root') as conn:
  3.         with CardOp(conn) as t:
  4.             print(t.card_op('10.26.0.5',9002,['ipconfig']))
复制代码
通过双层with调用,不仅如此,我们可以看到在第二层with中调用的函数使用了第一层调用的句柄,这意味着对于复数级的资源调用,也可以通过这种多层嵌套的方式处理,通过对这一语方的封装,比如用eval()函数实现自动编写后执行,可以实现指定的多层登陆跳转、多级设备穿透性维护等功能。





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2