使用 with 语句创建 stem.control.Controller 对象是否有意义?

Is there a point to using a with statement for creating a stem.control.Controller object?

我有一些 python 与 tor 守护进程通信,在这里它告诉守护进程关闭。

from stem import Signal
from stem.control import Controller

def shutDownTor():
    with Controller.from_port(port=portNum) as controller:
        controller.signal(Signal.SHUTDOWN)

我正在使用 with 语句,因为我从 窃取的 学习的代码也是如此。代码工作正常,但我想知道使用 with 语句是否有任何意义。

我知道当您使用 with 打开文件时,即使有 Exception 或中断,它也会确保文件关闭。但在这种情况下,似乎 with 所做的只是添加一个不必要的选项卡。变量 controller 甚至留在命名空间内。

如果您想摆脱 with 语句,您将必须处理所有 opencloseexception 靠自己。

这将导致:

  try:
    controller = Controller.from_port()
  except stem.SocketError as exc:
    print("Unable to connect to tor on port 9051: %s" % exc)
    sys.exit(1)
  finally:
      controller.close()

结果相同,我将引用 "un-necessary tab"。

如果您了解并准备好应对所有后果[=其中 29=]。

您从 stem 导入的 Controller class 是一个 wrapper for ControlSocket which is itself a wrapper around a socket connection 到 Tor 协议。因此,当您在代码中使用 with 时,您这样做是为了打开与给定端口的连接。与 file 打开和关闭的方式相同,如果您想摆脱 with.

,则必须自己打开和关闭连接