gpt4 book ai didi

子类化列表的 Pythonic 方式

转载 作者:行者123 更新时间:2023-11-28 20:59:03 25 4
gpt4 key购买 nike

这是我的一般问题空间:

我有一个基于 I2C 的设备的字节/位协议(protocol)。

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

我有一个使用数据库的类和一个 i2c 驱动程序/事务处理器,这样我就可以调用命令并获得响应。

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

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

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

我希望 theStatus 像列表/字节数组一样工作,这样我就可以直接检查字节。我不在乎切片是不是字节列表或字节数组。一旦它们被切出,它们就只是字节。

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

我想通过字段名称检查 theStatus,例如 theStatus.FIELDNAMEtheStatus['FIELDNAME']'。同样的事情:一旦我有了一个以字节数组和数据库为成员的可行数据结构,我就可以做到这一点。

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

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

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

最佳答案

你真正想要的是实现一个新的 sequence type ,一个可能是可变的。您可以通过实现 special methods needed to emulate container types 从头开始​​创建一个,或者您可以使用合适的 collections.abc collection ABC作为基地。

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

例如,(不可变的) Sequence ABC只需要您提供 __getitem__ 的实现和 __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 .此类继承自 collections.abc.MutableSequence ,并添加了 list 的额外功能提供基本序列 ABC。如果您不需要额外的功能,请坚持使用基础 ABC。

关于子类化列表的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com