Six 的套接字实现

Six's socket implementation

我构建了一个在 Python 2 和 3 之间兼容的应用程序。为了在这两个 Python 版本之间提供兼容性,我使用 six library.

我的代码使用 sockets。在 Python 3 下,可以使用 with 语句创建它们,但在 Python 2 下,它声称缺少 __exit__ 属性。

六供一次性插座有什么作用吗?如果不是,您认为在这种情况下最明确的解决方案是什么?

AFAIK(通过扫描其文档)six 在这种情况下并没有做太多。在 Python 2 中,您可以使用 contextmanager 装饰器将 socket 包裹在上下文管理器中并提供:

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