代码之家  ›  专栏  ›  技术社区  ›  minou

在try-except块中使用python“with”语句

  •  81
  • minou  · 技术社区  · 14 年前

    这是将python“with”语句与try-except块结合使用的正确方法吗?:

    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()
    

    “with”语句的主要优点是我们可以去掉三行代码吗?对我来说似乎没那么有说服力 对于这个用例 (尽管我知道“with”语句还有其他用途)。

    编辑:以上两段代码的功能是否相同?

    4 回复  |  直到 14 年前
        1
  •  148
  •   Bernd Petersohn    14 年前
    1. 你给出的两个代码块是 相等的
    2. 老路 有一个严重的错误: 以防打开文件失败 将在 finally f 不是 束缚。

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

    如你所见 with 具有 声明。例如:

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

    具有 try...finally 内在层次的陈述。

        2
  •  7
  •   Peter Milley    14 年前

    如果 finally 最后 那是 利益 with

    是的,你结合的方式 try-except 这几乎是唯一的方法,因为 open 语句本身不能在 阻止。

        3
  •  1
  •   YoK    14 年前

    我想你搞错了“with”语句,它只会减少行数。

    在你的情况下,“with”是

    • 打开一个文件,
    • 一定要关上它。

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

    编辑:是的,您对“with”的用法是正确的,两个代码块的功能是相同的。

        4
  •  -4
  •   andrewsi Laxman Battini    9 年前

    以下代码的更具python风格的方式是:

    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()