具有无限成员的Python枚举

时间:2018-07-19 09:54:48

标签: python enums

我正在寻找一种在python中创建枚举的简单方法,该枚举包含许多成员,并且可能有无限数量的成员。

例如,当枚举可计数的集合或不想创建具有10000个成员的枚举,而是根据需要(即时)创建它们时,这可能被证明是有用的。

我的用例是为WRS-2平铺网格创建一个枚举,但是它也可以用于化学公式。


我正在考虑首先定义四种方法:

  • 名称= f1(值)
  • 值= f2(名称)
  • f3(value)返回值是否正确
  • f4(name)返回名称是否正确

然后我想使用python的一些魔术方法将这些方法插入正确的位置。


例如,我试图在新的元类中捕获__getattr__调用,并使用aenum包扩展了枚举,但是我无法使其工作。

谢谢

2 个答案:

答案 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')