Skip to main content
 首页 » 编程设计

python之重载列表理解行为

2025年05月04日10zfyouxi

我的任务是创建硬件笼子的模型。每个笼子包含 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']