本问题已经有最佳答案,请猛点这里访问。

我是Python的新手。在一个关于连接到MySQL和获取数据的教程中,我看到了with语句。我读到它,它与try-finally块有关。但我找不到一个我能理解的更简单的解释。

stackoverflow.com/questions/3012488/…

with语句打开一个资源,并保证当with块完成时,无论该块如何完成,都将关闭该资源。考虑一个文件:

with open('/etc/passwd', 'r') as f:

print f.readlines()

print"file is now closed!"

即使您有一个return,即使您引发异常,文件也保证在块的末尾关闭。

为了使with作出此保证,表达式(示例中的open()必须是上下文管理器。好消息是,许多Python表达式都是上下文管理器,但不是全部。

根据我发现的一个教程,MySQLdb.connect()实际上是一个上下文管理器。

此代码:

conn = MySQLdb.connect(...)

with conn:

cur = conn.cursor()

cur.do_this()

cur.do_that()

将作为单个事务提交或回滚命令序列。这意味着您不必太担心异常或其他异常代码路径——不管您如何离开代码块,事务都将得到处理。

从根本上讲,它是一个对象,它用在入口和出口调用的自定义逻辑来划分代码块,并且可以在其构造中接受参数。可以使用类定义自定义上下文管理器:

class ContextManager(object):

def __init__(self, args):

pass

def __enter__(self):

# Entrance logic here, called before entry of with block

pass

def __exit__(self, exception_type, exception_val, trace):

# Exit logic here, called at exit of with block

return True

然后入口被传递一个ContextManager类的实例,并且可以引用在__init__方法(文件、套接字等)中创建的任何内容。exit方法还接收在内部块和堆栈跟踪对象或None中引发的任何异常(如果逻辑完成而没有引发)。

然后我们可以这样使用它:

with ContextManager(myarg):

# ... code here ...

这对于管理资源生命周期、释放文件描述符、管理异常以及构建嵌入式DSL等更复杂的用途都很有用。

另一种(但等效的)构造方法是contextlib装饰器,它使用一个生成器来分离出入口逻辑。

from contextlib import contextmanager

@contextmanager

def ContextManager(args):

# Entrance logic here

yield

# Exit logic here

把with看作是在代码块上创建一个"主管"(上下文管理器)。甚至可以给主管一个名称并在块中引用。当代码块正常结束或通过异常结束时,会通知主管,主管可以根据发生的情况采取适当的措施。

with在python中啥意思,“with”语句在Python中做什么?相关推荐

  1. python语音合法命名-下列哪些语句在Python中是合法的( )

    [单选题]Python关系运算符中表示"不等于"的是哪个?________ [其它]自选某一主题查阅文献(必须有英文文献),撰写关于特殊儿童动作发展或康复训练相关的 文献综述 . ...

  2. python使用什么格式划分语句块-python以什么划分语句块

    语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句: 在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是同样的缩进量:(推荐学习:Python视频教程) 缩进:Pyth ...

  3. Oracle中修改存储过程名语句,修改存储过程中使用的语句是,select 语句使用存储过程...

    Q1:如何在SELECT语句中调用存储过程的结果 语法 SELECT [predicate] { *table.*[table.]field1 [AS alias1] [, [table.]field ...

  4. python中eof表示什么语句错误_python中pickle的EOF错误

    根据这些评论,我对最有可能的问题有一个猜测,但至少有50%的可能性我猜错了,在这种情况下--告诉我,我会删除答案.在 我猜你是在尝试使用流套接字,就好像它是一个消息序列一样.这是网络编程新手中非常常见 ...

  5. 开发中常用的linux语句,MySQL开发中常用的查询语句总结

    1.查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,,!=,!>,!,=< 2.查询字符串 SELECT * ...

  6. python中的pass是什么意思_Python中pass的作用与使用教程

    Python中pass的作用与使用教程 Python中pass的作用 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/java中: if(true) ; //d ...

  7. SQLite中特殊的INSERT语句

    SQLite中特殊的INSERT语句 在SQLite中,INSERT是基本语句,用来向表中插入数据.但是当表中存在字段存在唯一.非空.检查.主键等约束时,插入的数据很容易和约束冲突,造成插入操作失败. ...

  8. linux 中的if else语句

    linux 中的if  else语句 在shell中.if语句有三种形式,如下: 第一种: if  condition then command else command 在这种形式中,其中和c语言不 ...

  9. sql server根据表中数据生成insert语句

    sql server根据表中数据生成insert语句 -- ====================================================== --根据表中数据生成inser ...

最新文章

  1. Qt之FTP实现--QFtp篇
  2. 静态网页与动态网页区别
  3. IE8无法调试?IE进入不了调试状态
  4. PHP-FPM Fastcgi 未授权访问漏洞(端口9000)
  5. 深度学习《自动编码器》
  6. [转]如何才能在 IIS 7.5 使用 Windows PowerShell Snap-In 功能
  7. Qunar黑科技-无侵入在线Debug的实现
  8. web.config学习资料
  9. linux tab 缩进,codemirror TAB 缩进问题记录
  10. MS08067红队攻防班 第5期 开班倒计时1天~
  11. Relative Orientation 与fundamental essential matrix
  12. 电商订单后台管理系统
  13. 读书笔记:《Designing Data-Intensive Applications》
  14. 3D成像方法 汇总(原理解析)— 双目视觉、激光三角、结构光、ToF、光场、全息...
  15. protege 简介
  16. APEX包管理器简述(二)
  17. 李骐老师--实战项目管理专家--老师多个课程版权--沪师经纪刘建
  18. Codevs5288 航线设计(动态规划加强版) 解题报告
  19. 微软人工智能公开课中文版视频一,微软人工智能概览
  20. 撤稿声明澎湃计算机应用,“最霸气撤稿声明”论文作者:会继续研究,感谢关心...

热门文章

  1. 采用Spring管理Bean和依赖注入
  2. LayoutInflater——inflate方法不同参数的区别
  3. android 静态链接,android通过C代码实现动态和静态链接
  4. 基于JAVA+SpringMVC+MYSQL的火车票订票系统
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生综合成绩测评系统
  6. 机器学习 - 损失计算-softmax_cross_entropy_with_logits
  7. [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
  8. angular $location服务获取url
  9. ios下fixed回复框bug的解决方案
  10. Creating a Pager Control for ASP.NET以及Dino Esposito 分页组件的一个 Bug