我正在寻找一种在python中创建枚举的简单方法,该枚举包含许多成员,并且可能有无限数量的成员。
例如,当枚举可计数的集合或不想创建具有10000个成员的枚举,而是根据需要(即时)创建它们时,这可能被证明是有用的。
我的用例是为WRS-2平铺网格创建一个枚举,但是它也可以用于化学公式。
我正在考虑首先定义四种方法:
然后我想使用python的一些魔术方法将这些方法插入正确的位置。
例如,我试图在新的元类中捕获__getattr__
调用,并使用aenum包扩展了枚举,但是我无法使其工作。
谢谢
答案 0 :(得分:0)
我不太确定您对enum
的理解是什么,以及您希望它具有什么属性,但实际上看起来您正在定义一个将item
与之关联的函数一个数字(任何数字),只要相同即可。我认为可以使用生成器和类似这样的列表相对容易地完成此操作:
def ienum(item, items=[]):
if item in items:
return items.index(item)
else:
items.append(item)
return items.index(item)
ienum('foo')
# 0
ienum('bar')
# 1
ienum('foo')
# 0
# etc.
如果您想控制与该名称相关联的值,则实际上需要一个dict
(可能语法稍有不同)或(哈希?)函数。
答案 1 :(得分:0)
我认为您正在寻找的是set
内置类。遵循tutorial within the official documentation是一个不错的起点:
可以通过文字语法或通过函数调用来创建集合:
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> basket = set(['apple', 'orange', 'apple', 'pear', 'orange', 'banana'])
它们不包含重复项:
>>> print(basket)
{'orange', 'banana', 'pear', 'apple'}
它们支持非常快速的成员资格测试,这就是为什么我认为它们适合您遇到的问题:
>>> 'orange' in basket
True
集可以随需要增长而变大:
>>> basket.add('grape')