【问题标题】:What is the python keyword "with" used for? [duplicate]python关键字“with”是做什么用的? [复制]
【发布时间】:2010-11-25 01:36:30
【问题描述】:

python 关键字“with”是干什么用的?

示例来自:http://docs.python.org/tutorial/inputoutput.html

>>> with open('/tmp/workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

【问题讨论】:

标签: python


【解决方案1】:

在 python 中,with 关键字用于处理非托管资源(如文件流)。它类似于 VB.NET 和 C# 中的using 语句。它允许您确保在使用它的代码完成运行时“清理”资源,即使抛出异常也是如此。它为try/finally 块提供“语法糖”。

来自Python Docs

with 语句澄清了以前使用try...finally 块的代码,以确保执行清理代码。在本节中,我将讨论常用的语句。在下一节中,我将检查实现细节并展示如何编写用于此语句的对象。

with 语句是一个控制流结构,其基本结构是:

with expression [as variable]:
    with-block

表达式被求值,它应该产生一个支持上下文管理协议的对象(即具有__enter__()__exit__() 方法)。

更新根据 Scott Wisniewski 的评论修复了 VB 标注。我确实混淆了withusing

【讨论】:

  • 有哪些方法可以关闭打开的资源?如果我创建了自己的文件系统对象,它有自己的特殊打开/关闭方法,“with”关键字会与这些对象一起使用吗?还是“with”只适用于内置的 Python 资源类型?
  • 在 Python 中,看起来自定义对象必须实现(或从实现的东西继承)__enter____exit__ 方法。使用 IronPython(.Net 上的 python),您可以从 IDisposable 实现,这将涵盖它。不确定纯 Python 或其他框架中的最佳方式是什么。
  • 仅供参考:这混淆了 VB.NET 中的“using”语句,它的行为类似于 python 中的“with”块,而 VB 中的“with”语句则完全不同。请参阅以下内容:msdn.microsoft.com/en-us/library/htd05whh.aspxmsdn.microsoft.com/en-us/library/wc500chb(v=vs.110).aspx
  • 我希望 JavaScript with...
  • @xdhmoore ((shouldIUseWith, o) => { with (o) console.log('should I use with? ' + shouldIUseWith) })('yes', {shouldIUseWith: 'no' })
【解决方案2】:

Explanation from the Pershing on Programming blog:

当您有两个相关的操作想要进行时,它会很方便 以一对或更多的形式执行,中间有一段代码。经典 例如打开一个文件,操作文件,然后 关闭它:

 with open('output.txt', 'w') as f:
     f.write('Hi there!')

上面的with语句会自动关闭文件后 嵌套的代码块。 (继续阅读以确切了解如何关闭 发生。)使用 with 语句的优点是它是 无论嵌套块如何退出,都保证关闭文件。如果 在块结束之前发生异常,它将关闭 在异常被外部异常处理程序捕获之前的文件。如果 嵌套块将包含一个 return 语句,或 continue 或 break 语句,with 语句会自动关闭文件 在这些情况下也是如此。

【讨论】:

  • 我想为在 python 中使用 with 添加一个额外的答案,与打开或关闭文件无关:def test_new_user_invalid_email(self): """测试创建没有电子邮件的用户会引发错误"" " with self.assertRaises(ValueError): get_user_model().objects.create_user(None, 'pass@word')
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2011-09-04
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多