我的任务是创建硬件笼子的模型。每个笼子包含 N 个插槽,每个插槽可能包含也可能不包含卡片。
我想使用列表为笼子建模。每个列表索引将对应于插槽号。 cards[0].name="Card 0"等
这将允许我的用户通过简单的列表理解来查询模型。例如:
for card in cards:
print card.name
我的用户不是熟练的 Python 用户,他们将实时与模型交互,因此让列表索引不对应于填充的卡片是不切实际的。换句话说,如果用户移除了一张卡片,我需要做一些事情来表明这张卡片没有被填充——我的第一个冲动是将列表项设置为 None。
Bossman 喜欢这个方案,但他对上面的列表理解如果缺少一张卡片就会失败并不疯狂。 (目前确实如此。)他甚至更不支持要求用户学习足够多的 Python 来创建将忽略 None 的列表理解表达式。
我的想法是对 list 类进行子类化,创建一个 newclass。它的工作方式与列表完全一样,除了 for card in cards 只会返回未设置为 None 的成员。
有人可以演示如何重载列表类,以便在子类上调用的列表理解将忽略 None 吗? (到目前为止,当我尝试这样做时,我的 Python 技能已经开始崩溃。)
谁能提出更好的方法?
请您参考如下方法:
>>> class MyList(list):
... def __iter__(self):
... return (x for x in list.__iter__(self) if x is not None)
...
>>>
>>> ml = MyList(["cat", "dog", None, "fox"])
>>> for item in ml:
... print item
...
cat
dog
fox
>>> [x for x in ml]
['cat', 'dog', 'fox']
>>> list(ml)
['cat', 'dog', 'fox']
