ufoofuufoofu 发表于 2024-9-27 10:52:46

奇妙的上下文管理器

      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()函数实现自动编写后执行,可以实现指定的多层登陆跳转、多级设备穿透性维护等功能。
页: [1]
查看完整版本: 奇妙的上下文管理器