如何在Python中使用socket作为上下文管理器?

2024-01-15

似乎做这样的事情是很自然的:

with socket(socket.AF_INET, socket.SOCK_DGRAM) as s:

但Python没有为socket实现上下文管理器。我可以轻松地将它用作上下文管理器吗?如果可以,如何使用?


The socket模块相当低级,使您几乎可以直接访问 C 库功能。

您可以随时使用contextlib.contextmanager装饰者 http://docs.python.org/2/library/contextlib.html#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:

or use contextlib.closing() http://docs.python.org/2/library/contextlib.html#contextlib.closing达到同样的效果:

from contextlib import closing

with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as s:

but the contextmanager()装饰器使您有机会首先使用套接字执行其他操作。

Python 3.x 确实使socket()上下文管理器,但文档未更新以反映这一点直到 2016 年进入 Python 3.5 周期 https://github.com/python/cpython/commit/e37fc18b3c0d5fe13d75f37d9ae9c4387a46ee3d。请参阅socket class http://hg.python.org/cpython/file/e57c8a90b2df/Lib/socket.py#l87在源代码中,添加了__enter__ and __exit__方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中使用socket作为上下文管理器? 的相关文章

随机推荐

  • 重复使用表格单元格中的 UIswitch

    我的 uiswitch 有问题UITableViewCell每当我更改属于特定部分的特定单元格中的开关值时 所有其他具有相同部分的单元格inexPath row改变 请帮忙 这是我的代码cellForRowAtIndexPath metho
  • 把一个偶数分成N份,每份都是2的倍数

    假设我有号码100我需要将其分为 N 部分 每个部分最初不应超过 30 因此初始分组为 30 30 30 余数 即 10 将通过连续向每个组添加 2 来分配到这三个组中 从而确保每个组都是 2 的倍数 因此 所需的输出应类似于 34 34
  • html DOM 节点限制

    我正在开发一个终端模拟器以获取乐趣 并了解后端的基础知识和运行 然而 我不断遇到前端的性能问题 大家可能都知道 终端窗口中的每个字符都可以有不同的样式 颜色 背景 粗体 下划线等 所以我的想法是使用 span 对于视图窗口中的每个字符 并在
  • 如何获取 Angular Material 滑块的当前值?

    我的问题与获取角度 2 中的 mdslider 值 https stackoverflow com questions 46906219 get mdslider value in angular 2因为我需要将滑块的值传递给组件 而不是
  • Java 中的 MidiUnavailableException?

    我在 Java 中播放 MIDI 文件时遇到一些问题 我得到的是一个MidiUnavailableException MIDI OUT transmitter not available 当我尝试玩它时 我的代码是标准的 try midis
  • 在 Python 中解压格式字符

    我需要这个 Perl 字符串的 Python 模拟 unpack nNccH string val 我需要nNccH Python 格式字符的数据格式 在 Perl 中 它将二进制数据解压为五个变量 网络 中的 16 位值 大端 网络 中的
  • 如何在 Vue.js 中延迟 @keyup 处理程序

    my view ns input filterName type text v model filterName keyup searchTimeOut 在我的 vue 代码中 getUsers API users index params
  • QStyledItemDelegate 绘制刷新问题

    我目前正在尝试研究模型视图方法并编写缩略图查看器应用程序 在此示例中 我只是尝试绘制 20 个框 但我得到的似乎是随机选择 该选择会随着鼠标移动而更新 滚动使事情变得更糟 有时绘制的只有框等 而且文本似乎根本没有渲染 对我来说 这看起来像是
  • 为什么我们需要strdup()?

    当我在做作业时 我开始知道我们不应该使用诸如以下的作业 char s HELLO WORLD 使用此类语法的程序很容易崩溃 我尝试并使用 int fun char temp do sum operation on temp print te
  • 在 CAS 中,如果尚未接受协议,如何限制仅访问一项服务?

    有一个要求 用户应该首先接受一些许可协议 存在仅在服务中 以便能够登录所有其他服务 所以流程应该是 用户通过CAS登录 因为他还没有接受协议 所以只能登录serviceS 当他接受serviceA上的协议后 他也可以登录其他服务 Notes
  • 选择后提交

    我读过解释时commit可能需要在selectDB2 和 MySQL 的语句 DB2 中的选择查询是否需要提交 https stackoverflow com questions 1521475 is a commit needed on
  • appengine 上的查询响应大小限制?

    Appengine 文档提到实体大小和批量获取请求 db get 的 1Mb 限制 http code google com appengine docs python datastore overview html http code g
  • Nginx/Web 服务器术语中的“反向代理”和“负载平衡”是什么?

    这是我经常听到的两个短语 主要与 Nginx 相关 有人可以给我一个外行的定义吗 定义通常很难理解 我想您只需要对其用例进行一些解释 简单解释一下就是 负载均衡是反向代理的功能之一 反向代理是可以做负载均衡的软件之一 下面给出了一个很长的解
  • 从大型数组中返回均匀“间隔”数量的索引。

    我有一个包含 20 个 RGB 颜色值的 Javascript 数组 如下所示 defaultColors rgb 58 185 180 rgb 63 186 172 rgb 71 185 159 rgb 80 185 146 rgb 90
  • PHP.net 说 md5() 和 sha1() 不适合密码?

    http www php net manual en faq passwords php faq passwords fasthash http www php net manual en faq passwords php faq pas
  • 根据 QWizardPage 内容的变化动态添加/删除 Finish

    我正在关注 a 上的教程许可证向导 http doc qt io qt 5 qtwidgets dialogs licensewizard example html using PyQt5 尝试学习如何创建非线性向导 然而我似乎陷入了一个问
  • 加载共享库时出错:libbsoncxx.so._noabi:无法打开共享对象文件:没有这样的文件或目录

    我安装了 mongocxx 驱动程序 如图所示http mongodb github io mongo cxx driver mongocxx v3 installation http mongodb github io mongo cxx
  • Android 自动调整 TextViews 在减小字体大小之前会分割单词

    有办法避免吗 如果我的文本是 Blablabla 并且它不适合正方形 我不希望有类似的内容 Blabla bla 我想要较小字体的 Blablabla 有没有办法控制自动调整大小的 TextView 是否会分割单词 这是该问题的一个示例 最
  • 在 .net 4.5 中通过单步并行化 for 循环

    我有一个类似于下面代码的函数 其目的是从一组点中一次取出一个三角形面 其中每三个点都是一个面 并对它们进行细分 用一系列边长不超过 nodeSize 的较小面替换该面 当然 对于任何现实的小面网格来说 此函数都是耗时的 我想重构它以使用一些
  • 如何在Python中使用socket作为上下文管理器?

    似乎做这样的事情是很自然的 with socket socket AF INET socket SOCK DGRAM as s 但Python没有为socket实现上下文管理器 我可以轻松地将它用作上下文管理器吗 如果可以 如何使用 The