该socket
模块相当底层,使您几乎可以直接访问C库功能。
您始终可以使用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:
或用于contextlib.closing()
达到相同效果:
from contextlib import closing
with closing(socket.socket(socket.AF_INET, socket.soCK_DGRAM)) as s:
但是contextmanager()
装饰器使您有机会首先使用套接字执行其他操作。
Python 3.x确实可以socket()
创建上下文管理器,但是直到2016年Python 3.5周期才进行更新,文档并未得到反映。请参阅源代码中的socket
类,其中添加了__enter__
和__exit__
方法。