对列表进行子类化的 Pythonic 方式

2024-01-05

这是我的一般问题空间:

我通过 I2C 与设备建立了字节/位协议。

我有一个命令的“数据库”,可以完整描述所有位字段类型、值和枚举。

我有一个类来使用数据库和一个 i2c 驱动程序/事务器,以便我可以调用命令并获取响应。

MyProtocol = Protocol('database.xml',I2CDriver())
theStatus = MyProtocol.GET_STATUS()

为 GET_STATUS 命令创建正确的字节流,通过 i2c 发送它并当前以字节数组形式返回响应。我可以让它在 GET_STATUS() 实现中漂亮地打印响应,但我想将该行为移至返回对象,而不是在命令中。

我希望我的返回对象是“智能”的:theStatus需要有字节列表/数组以及对其字段定义的引用。

I want theStatus像列表/字节数组一样,所以我可以直接检查字节。我不关心切片是否是字节列表或字节数组之外的任何内容。一旦它们被切掉,它们就只是字节了。

我希望能够打印“theStatus”print(theStatus)并让它漂亮地打印状态中的所有字段。一旦我确定了一个可行的数据结构,允许我访问字节和数据库,我就很清楚如何实现这一点。

我想检查theStatus按字段名称,例如theStatus.FIELDNAME或者可能theStatus['FIELDNAME']'。同样的事情:一旦我有了一个以字节数组和数据库作为成员的可用数据结构,我就可以实现这一点。

问题是我不知道导致最少问题的“正确”数据结构。

关于最Pythonic的方法来完成这个任务有什么建议吗?我最初的想法是子类化list并将字段定义添加为成员,但似乎 python 根本不喜欢这个想法。

构图似乎是下一个赌注,但让它表现得像一个合适的list看起来这可能需要大量工作才能使其“正确”。


你真正想要的是实施一个新的sequence type https://docs.python.org/3/glossary.html#term-sequence,一个可能是可变的。您可以通过实施以下方式从头开始创建一个模拟容器类型所需的特殊方法 https://docs.python.org/3/reference/datamodel.html#emulating-container-types,或者您可以使用合适的collections.abc集合ABC https://docs.python.org/3/library/collections.abc.html#collections-abstract-base-classes作为基地。

后者可能是最简单的路径,因为 ABC 提供了许多方法的实现作为基础版本,这些版本依赖于您必须实现的一些抽象方法。

例如,(不可变)Sequence ABC https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence只需要您提供以下实现__getitem__ and __len__;基本 ABC 实现提供了其余部分:

from collections.abc import Sequence

class StatusBytes(Sequence):
    def __init__(self, statusbytes):
        self._bytes = statusbytes

    def __getitem__(self, idx_or_name):
        try:
            return self._bytes[idx_or_name]
        except IndexError:
            # assume it is a fieldname
            return FIELDNAMES[idx_or_name]

    def __len__(self):
        return len(self._bytes)

如果您确实需要完整的列表实现,包括对丰富比较的支持(list_a <= list_b), 排序 (list_a.sort()),复制[list_a.copy()] 和乘法 (list_a * 3),那么还有collections.UserList() class https://docs.python.org/3/library/collections.html#collections.UserList。这个类继承自collections.abc.MutableSequence,并添加了额外的功能list提供碱基序列 ABC。如果你don't需要额外的功能,请坚持基本的 ABC。

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

对列表进行子类化的 Pythonic 方式 的相关文章

  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • 如何使用 colorchecker 在 opencv 中进行颜色校准?

    我有数码相机获取的色彩检查器图像 我如何使用它来使用 opencv 校准图像 按照以下颜色检查器图像操作 您是想问如何进行颜色校准或如何使用 OpenCV 进行校准 为了进行颜色校准 您可以使用校准板的最后一行 灰色调 以下是您应该逐步进行
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • 在 python 3 中使用子进程

    我使用 subprocess 模块在 python 3 中运行 shell 命令 这是我的代码 import subprocess filename somename py in practical i m using a real fil
  • Pyqt-如何因另一个组合框数据而更改组合框数据?

    我有一个表 有 4 列 这 4 列中的两列是关于功能的 一个是特征 另一个是子特征 在每一列中 所有单元格都有组合框 我可以在这些单元格中打开txt 我想 当我选择电影院作为功能时 我只想看到子功能组合框中的电影名称 而不是我的 数据 中的
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • PyTorch 给出 cuda 运行时错误

    我对我的代码做了一些小小的修改 以便它不使用 DataParallel and DistributedDataParallel 代码如下 import argparse import os import shutil import time
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • CNTK 抱怨 LSTM 中的动态轴

    我正在尝试在 CNTK 中实现 LSTM 使用 Python 来对序列进行分类 Input 特征是固定长度的数字序列 时间序列 标签是 one hot 值的向量 Network input input variable input dim
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • Python、subprocess、call()、check_call 和 returncode 来查找命令是否存在

    我已经弄清楚如何使用 call 让我的 python 脚本运行命令 import subprocess mycommandline lumberjack sleep all night work all day subprocess cal
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • 从 python 检测 macOS 中的暗模式

    我正在编写一个 PyQt 应用程序 我必须添加一个补丁 以便在启用暗模式的 Macos 上可以读取字体 app QApplication Fix for the font colours on macos when running dark
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • 使用Multiprocessing和Pool时如何访问全局变量?

    我试图避免将变量冗余地传递到dataList e g 1 globalDict 2 globalDict 3 globalDict 并在全球范围内使用它们 global globalDict然而 在下面的代码中并不是这样做的解决方案 是否有

随机推荐

  • JavaScript 中的原型不好吗?

    In Felix 的 Node js 风格指南 http nodeguide com style html它说 不要扩展任何原型 对象 尤其是本地对象 那里 地狱里有一个特殊的地方等待着 如果你不遵守这条规则 本文 http howtono
  • 整数如何存储在内存中?

    当我阅读一篇有关大 小端的文章时 我很困惑 代码如下 include
  • 在 Centos 6.3 中使用 php-ldap

    我正在尝试使用 php 构建 LDAP 界面 但遇到了这个奇怪的问题 我已经在我的基本 php 安装上使用 yum 安装了 php ldap 包 但每当我调用 ldap connect 时 它都会说该函数未定义 看到 phpinfo 我可以
  • 正则表达式逗号后面没有空格

    我目前正在尝试创建一个表达式 以捕获所有后面没有空格的逗号以及所有冒号 我试过了 s 很接近 但似乎也抓住了逗号后面没有空格的字符 我也尝试过 s 它将抓取所有冒号和所有逗号 其后有一个空格以及空格 我希望选择的内容包含在下面的 中 你好
  • 如何更改视频方向

    我目前有一个 iPhone 应用程序 可以让用户拍摄视频 将其上传到服务器 并允许其他人从该应用程序查看他们的视频 从来没有遇到过视频方向的问题 直到我制作一个网站来观看不同的视频 以及其他内容 我使用来自网络服务的视频 并使用 video
  • 无法解析模块react/lib/ReactUpdates

    我正在克隆一个项目 步骤是 npm i 反应本机链接 当我运行它时react native run ios我有一个问题RCTWebSocket图书馆 如果你稍微搜索一下 这个问题很容易解决 只需要删除 2 个编译器标志 在Custom Co
  • 如何从python Flask中的mongodb mlab返回包含键中特定关键字的文档[重复]

    这个问题在这里已经有答案了 我在 mongodb 中有这个集合 我的收藏 id 5ad2079019551a2108588add brand name MAZOLA LIZA name pyd id 5ad2079019551a210858
  • “ng build”与“ng build --prod”不一致

    我正在开发一个有角度的应用程序 Using Angular 5 2 5 角度 CLI1 6 8 当我执行命令时 ng build 我没有收到任何错误 但是当我尝试生产构建时 ng build prod 我收到错误 属性 someProper
  • Spring启动错误:java.lang.ArrayStoreException:sun.reflect.annotation.TypeNotPresentExceptionProxy

    我想使用 spring boot 来启动我的应用程序 但是在我在 pom xml 添加一些相关的 jar 后 它返回此错误 我感谢可能是由一些冲突 jar 引起的 应用程序 java package com mm application i
  • 检查日期是否是过去的Javascript

    全部 我使用 jQuery UI 作为日期选择器 我正在尝试使用 javascript 检查用户输入的日期是否是过去的日期 这是我的表单代码
  • 计算值太大而无法求幂的马尔可夫链概率

    我使用公式 exp X 作为马尔可夫链的速率 因此选择一个链接相对于另一个链接的比率是 exp X1 exp X2 我的问题是有时X很大 所以exp X 会超出范围double 或者 给定一个 X i 数组 其中一些 X i 太大 以致 e
  • 如何查看矩阵乘法的进度?

    我现在只需要显示矩阵乘法的中间进度 for unsigned int col 0 col
  • uitableview 部分标题内的日期格式,请帮忙

    首先我要说的是 我对 iPhone 开发非常陌生 但我非常努力地学习 因此 非常感谢你们专业人士愿意分享的任何帮助 所以我有一个问题 如果有人能回答我的话那就太棒了 我正在研究更多一项核心数据 并一直在使用苹果开发者网站上找到的核心数据书籍
  • 无法访问 usort() 函数调用内部的全局变量

    我正在尝试使用usort 并在其函数范围内利用全局变量 但没有成功 我已将代码简化为简单的框架以展示我的意思 testglobal 1 function cmp a b global testglobal echo hi testgloba
  • 对哈德逊的“圣杯战争”自动回复“是”

    我们正在使用 grails war 来构建对 hudson 的战争 然后将另一项工作部署到我们的测试环境 问题在于 当 grails war 遇到插件升级时 它会不断要求用户升级某些插件 有没有办法对所有用户输入响应 y 我尝试过 non
  • 服务器端病毒扫描[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 如何读取数据文件?

    如果我有数据file txt我想使用以下命令将数据读取到变量中 set 我怎样才能做到这一点 如何将一行移动到另一行 根据您的评论从文件中读取两行 echo off setLocal EnableDelayedExpansion for f
  • 在异步任务之间自由切换的正确方法是什么?

    假设我有一些异步运行的任务 它们可能是完全独立的 但我仍然想设置任务暂停的点 以便它们可以同时运行 并发运行任务的正确方法是什么 我目前正在使用await asyncio sleep 0 但我觉得这增加了很多开销 import asynci
  • akka 中每个主机的最大 Actor 数量

    akka 的一个盒子上最多可以有多少个 actor public void MyActor extends AkkaActor receive Objet obj so something 1 Is there some limit on
  • 对列表进行子类化的 Pythonic 方式

    这是我的一般问题空间 我通过 I2C 与设备建立了字节 位协议 我有一个命令的 数据库 可以完整描述所有位字段类型 值和枚举 我有一个类来使用数据库和一个 i2c 驱动程序 事务器 以便我可以调用命令并获取响应 MyProtocol Pro