似乎做这样的事情是很自然的:
with socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
但Python没有为socket实现上下文管理器。我可以轻松地将它用作上下文管理器吗?如果可以,如何使用?
The socket
模块相当低级,使您几乎可以直接访问 C 库功能。
您可以随时使用contextlib.contextmanager装饰者 http://docs.python.org/2/library/contextlib.html#contextlib.contextmanager构建您自己的:
import socket
from contextlib import contextmanager
@contextmanager
def socketcontext(*args, **kw):
s = socket.socket(*args, **kw)
try:
yield s
finally:
s.close()
with socketcontext(socket.AF_INET, socket.SOCK_DGRAM) as s:
or use contextlib.closing() http://docs.python.org/2/library/contextlib.html#contextlib.closing达到同样的效果:
from contextlib import closing
with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as s:
but the contextmanager()
装饰器使您有机会首先使用套接字执行其他操作。
Python 3.x 确实使socket()
上下文管理器,但文档未更新以反映这一点直到 2016 年进入 Python 3.5 周期 https://github.com/python/cpython/commit/e37fc18b3c0d5fe13d75f37d9ae9c4387a46ee3d。请参阅socket class http://hg.python.org/cpython/file/e57c8a90b2df/Lib/socket.py#l87在源代码中,添加了__enter__
and __exit__
方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)