with在python中啥意思,“with”语句在Python中做什么?
本问题已经有最佳答案,请猛点这里访问。
我是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中做什么?相关推荐
- python语音合法命名-下列哪些语句在Python中是合法的( )
[单选题]Python关系运算符中表示"不等于"的是哪个?________ [其它]自选某一主题查阅文献(必须有英文文献),撰写关于特殊儿童动作发展或康复训练相关的 文献综述 . ...
- python使用什么格式划分语句块-python以什么划分语句块
语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句: 在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是同样的缩进量:(推荐学习:Python视频教程) 缩进:Pyth ...
- Oracle中修改存储过程名语句,修改存储过程中使用的语句是,select 语句使用存储过程...
Q1:如何在SELECT语句中调用存储过程的结果 语法 SELECT [predicate] { *table.*[table.]field1 [AS alias1] [, [table.]field ...
- python中eof表示什么语句错误_python中pickle的EOF错误
根据这些评论,我对最有可能的问题有一个猜测,但至少有50%的可能性我猜错了,在这种情况下--告诉我,我会删除答案.在 我猜你是在尝试使用流套接字,就好像它是一个消息序列一样.这是网络编程新手中非常常见 ...
- 开发中常用的linux语句,MySQL开发中常用的查询语句总结
1.查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,,!=,!>,!,=< 2.查询字符串 SELECT * ...
- python中的pass是什么意思_Python中pass的作用与使用教程
Python中pass的作用与使用教程 Python中pass的作用 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/java中: if(true) ; //d ...
- SQLite中特殊的INSERT语句
SQLite中特殊的INSERT语句 在SQLite中,INSERT是基本语句,用来向表中插入数据.但是当表中存在字段存在唯一.非空.检查.主键等约束时,插入的数据很容易和约束冲突,造成插入操作失败. ...
- linux 中的if else语句
linux 中的if else语句 在shell中.if语句有三种形式,如下: 第一种: if condition then command else command 在这种形式中,其中和c语言不 ...
- sql server根据表中数据生成insert语句
sql server根据表中数据生成insert语句 -- ====================================================== --根据表中数据生成inser ...
最新文章
- Qt之FTP实现--QFtp篇
- 静态网页与动态网页区别
- IE8无法调试?IE进入不了调试状态
- PHP-FPM Fastcgi 未授权访问漏洞(端口9000)
- 深度学习《自动编码器》
- [转]如何才能在 IIS 7.5 使用 Windows PowerShell Snap-In 功能
- Qunar黑科技-无侵入在线Debug的实现
- web.config学习资料
- linux tab 缩进,codemirror TAB 缩进问题记录
- MS08067红队攻防班 第5期 开班倒计时1天~
- Relative Orientation 与fundamental essential matrix
- 电商订单后台管理系统
- 读书笔记:《Designing Data-Intensive Applications》
- 3D成像方法 汇总(原理解析)— 双目视觉、激光三角、结构光、ToF、光场、全息...
- protege 简介
- APEX包管理器简述(二)
- 李骐老师--实战项目管理专家--老师多个课程版权--沪师经纪刘建
- Codevs5288 航线设计(动态规划加强版) 解题报告
- 微软人工智能公开课中文版视频一,微软人工智能概览
- 撤稿声明澎湃计算机应用,“最霸气撤稿声明”论文作者:会继续研究,感谢关心...
热门文章
- 采用Spring管理Bean和依赖注入
- LayoutInflater——inflate方法不同参数的区别
- android 静态链接,android通过C代码实现动态和静态链接
- 基于JAVA+SpringMVC+MYSQL的火车票订票系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生综合成绩测评系统
- 机器学习 - 损失计算-softmax_cross_entropy_with_logits
- [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
- angular $location服务获取url
- ios下fixed回复框bug的解决方案
- Creating a Pager Control for ASP.NET以及Dino Esposito 分页组件的一个 Bug