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