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
我构建了一个在 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