gpt4 book ai didi

python - 是否可以让 contextlib.closing() 调用任意清理方法而不是 .close()

转载 作者:太空狗 更新时间:2023-10-30 00:29:59 30 4
gpt4 key购买 nike

我在 python 中使用 with 语句( PEP 343 ) 时遇到了一些问题,以便在上下文之后自动管理资源清理。特别是,with 语句 始终假定资源清理方法是 .close()。 IE。在下面的代码块中,browser.close() 会在执行超出上下文时自动调用,但是,browser.close() 不是正确的清理方法因为它只关闭当前窗口而不是整个浏览器。它应该做的是调用 browser.quit()

with contextlib.closing(webdriver.Firefox()) as browser:
# do something with browser
# at this point browser.close() has been called.

不幸的是,contextlib.closing 没有提供自定义要调用的清理方法名称的方法,如 here 所示:

 def __exit__(self, *exc_info):
self.thing.close()

但是,我确实注意到有一个参数 exec_info 但未在该特定方法中使用。有人知道为什么吗?

更大的问题是,如标题所示,如果可能的话,如何让 self.thing 调用任意清理方法?如果没有,最好的解决方法是什么?我应该退回到使用 try...finally 吗?

最佳答案

好吧,它是 python,你可以创建自己的 closing 类,基于 contextlib.closing 并覆盖 __exit__() 方法:

import contextlib
from selenium import webdriver

class closing(contextlib.closing):
def __exit__(self, *exc_info):
self.thing.quit()


with closing(webdriver.Firefox()) as browser:
browser.get('http://stackoverflow.com')

仅供引用,有人建议将 webdriver 设为上下文管理器,但由于 quit()won't fix 而关闭是关闭浏览器的正确方法,应该显式调用它,参见 Make webdriver a context manager [python bindings] .

关于python - 是否可以让 contextlib.closing() 调用任意清理方法而不是 .close(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794278/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com