【问题标题】:Six's socket implementation六的socket实现
【发布时间】:2017-09-11 09:47:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: python python-3.x sockets python-2.x six


    【解决方案1】:

    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
    

    【讨论】:

    • 好点。与您的建议相比,我将应用的唯一更改是使用六个 Python 版本检查 (pythonhosted.org/six/#package-contents) 而不是 version_info[0]。
    • 补充问题:引入两个版本而不是只使用python2版本有什么好处?
    • @pt12lol 是的,我终于错过了尝试。我猜你可以将名称 socket 重新绑定到 Python 2 中的上下文管理器版本,但我不喜欢这样重命名标准名称。相反,我选择将其绑定到您可以无条件使用的新名称。
    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 2021-12-03
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多