我构建了一个兼容 Python 2 和 3 的应用程序。为了提供这两个 Python 版本之间的兼容性,我使用了六个库。
我的代码使用套接字。在 Python 3 下,可以使用with
语句创建它们,但在 Python 2 下,它声称缺少__exit__
属性。
六提供一次性插座有什么功能吗?如果不是,您认为在这种情况下最清楚的解决方案是什么?
AFAIK(通过扫描其文档)six
在这种情况下并没有做太多。在 Python 2 中,您可以使用装饰器封装socket
在上下文管理器中contextmanager
并提供:
from sys import version_info
import socket
if version_info[0] == 2:
from contextlib import contextmanager
@contextmanager
def sock(*args, **kwargs):
s = socket.socket(*args, **kwargs)
try:
yield s
finally:
s.close()
else: # Python 3
sock = socket.socket
在这两种情况下,您都相应地使用该with
语句:
with sock(socket.AF_INET, socket.SOCK_STREAM) as s:
# use s