我们不使用Python原生枚举

2021-01-30 06:47:24

枚举的基本问题是它们在左侧和右侧没有语义。让我们看一个例子:

目前尚不清楚为什么Apple和Apple的情况在这里有所不同,区别是什么意思?例如,我们将哪两个存储在数据库中?我们向用户显示哪些内容?

多年的经验使我们相信命名对您有所帮助,但微妙的名称却无济于事。我们尝试命名用户面对的字符串标签和标题。两者都不是好事,而且经常被误解。我们已经选择了display_name,以免造成误解。

唯一的问题是,苹果一词仍然没有与之关联的名称。我们认为这是一个不错的选择,我们将此字符串称为“名称”,有时也称为“代码名称”。这是进入数据库的字符串。没别的!

使用python枚举,很难为案例添加其他数据。您可以使用元组,但是它也存在没有语义的问题,但是元组越大,情况就越糟。这是官方文档中的示例:

行星等级(枚举):MERCURY =(3.303e + 23,2.4397e6)VENUS =(4.869e + 24,6.0518e6)EARTH =(5.976e + 24,6.37814e6)MARS =(6.421e + 23,3.3972e6) JUPITER =(1.9e + 27,7.1492e7)SATURN =(5.688e + 26,6.0268e7)URANUS =(8.686e + 25,2.5559e7)NEPTUNE =(1.024e + 26,2.4746e7)def __init__(self,mass ,radius):self。质量=质量#以千克为单位。半径=半径#以米为单位

如果不阅读构造函数,就无法理解数据的定义(构造函数也有点怪异,因为这里是self,而不是Planet类!)然后,构造函数将此位置混乱更改为命名的成员质量和半径。在tri.token中,它将是:

类Planet(令牌):mass = TokenAttribute()半径= TokenAttribute()类Planets(TokenContainer):MERCURY = Planet(质量= 3.303e + 23,半径= 2.4397e6)VENUS =行星(mass = 4.869e + 24,半径= 6.0518e6)地球=行星(质量= 5.976e + 24,半径= 6.37814e6)MARS =行星(质量= 6.421e + 23,半径= 3.3972e6)JUPITER =行星(质量= 1.9e + 27,半径= 7.1492 e7)SATURN =行星(质量= 5.688e + 26,半径= 6.0268e7)URANUS =行星(质量= 8.686e + 25,半径= 2.5559e7)NEPTUNE =行星(质量= 1.024e + 26,半径= 2.4746e7)

这对于每一行都具有清晰的语义,并且不需要Enum类上的构造函数。

上述问题的另一个常见解决方案是将质量和半径的数据放在其他位置。这导致需要协调和验证几个命令。

我们有很多情况下数据稀疏。这是枚举的样子:

这里的None(无)表示它不存在,并且哨兵默认值意味着自动生成默认值。在tri.token中,它将是:

total_download_name此处是一个特殊的标记值,因此我们可以将total_download_name = default缩短为total_download_name。

这个问题随枚举的每种情况而增加。截至撰写本文时,此示例中的Fields容器有486种情况,使稀疏数据问题更加严重。

类字段(枚举):party_group_name = dict(total_download_name = True,dw_name =" rec_party",)instrument_type = dict()Agreement_curr = dict(file_column) 但是,由于所有空的dict都相同,因此该操作不起作用,因此,如果添加avg_mtm_diff_usd = dict(),现在数据将被静默丢弃。 Python本机枚举非常适合其设计用途,但我们发现它们是有限的,并且不允许您以理智的方式增加其复杂性和用法。 我们在python枚举之前开发了tri.token,希望我们可以扔掉tri.token并用枚举代替它,但不幸的是事实并非如此。