这是将python“与“”语句结合结合使用的正确方法?:

try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

如果是这样,请考虑旧的做事方式:

try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

这里的“带有”声明的主要好处是我们可以摆脱三行代码?对我来说似乎并不令人信服 对于此用例 (尽管我知道“带有”语句具有其他用途)。

编辑:上述两个代码相同的功能是否相同?

EDIT2:最初的几个答案通常谈论使用“与”的好处,但是这里似乎有微不足道的好处。多年来,我们已经(或应该一直)明确调用f.close()。我想一个好处是,草率的编码器将受益于“使用”。

有帮助吗?

解决方案

  1. 您给出的两个代码块是不是 相等的
  2. 您描述的代码 旧的做事方式 有一个严重的错误:如果打开文件失败,您将在该文件中获得第二个例外finally 条款是因为 f 不绑定。

等效的旧样式代码将是:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

如您所见, with 语句可以使事情少易于。在Python(2.7,3.1)的较新版本中,您也可以将多个表达式组合在一个中 with 陈述。例如:

with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

除此之外,我个人认为尽早发现任何例外的习惯。这不是例外的目的。如果可能失败的IO函数是更复杂的操作的一部分,那么在大多数情况下,IOERROR应该中止整个操作,因此可以在外部层面进行处理。使用 with 陈述,您可以摆脱所有这些 try...finally 内部级别的陈述。

其他提示

如果内容 finally 块由要打开的文件对象的属性确定 finally 堵塞? 那是 好处 with 语句,在此特定实例中节省了三行代码。

是的,您合并的方式 withtry-except 几乎是唯一的方法,因为在 open 声明本身不能被抓住 with 堵塞。

我认为您对“使用”声明仅降低线条的说法是错误的。它实际上进行了初始化并处理拆解。

在您的情况下,“有”

  • 打开文件,
  • 处理其内容,并
  • 确保关闭它。

这是理解“带”语句的链接: http://effbot.org/zone/python-with-statement.htm

编辑:是的,您对“使用”的用法是正确的,并且两个代码块的功能都是相同的。关于为什么使用“与”的问题?这是因为您得到的好处。就像您提到的关于意外缺少f.close()的情况一样。

用于以下代码的Pythonic方法是:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

try:
    f = open("file", "r")
except IOError:
    <whatever>
else:
    f.close()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top