【发布时间】:2019-02-28 20:15:30
【问题描述】:
我知道,我知道,here 和 there 已经有类似的问题了。但他们的问题和答案并不是我想要的。此外,它们是锁定问题,因此我无法为它们添加新答案。 SMH。
首先,让我们澄清问题以了解其范围。在像这样在其他静态语言中使用枚举时:
public enum Size
{
SMALL=0,
MIDIUM=1,
LARGE=2,
BIG=2 // There can possibly be an alias
}
我们希望它能帮助我们:
- 在引用值时防止拼写错误。例如,
var foo = Size.SMALL是有效的,var bar = Size.SMAL应该会产生一个糟糕的错误。 - 枚举值可以支持字符串,如
HTTP404 = "Not Found", HTTP200 = "OK", ...。 (因此,那些基于range(N)的实现是不可接受的。) - 将参数定义为特定的 Enum 类型时,它作为一种规则,只接受该类型的值。例如,
public void Foo(Size size) {...} -
我还希望这些值在我的 Enum 解决方案中成为一等公民。这意味着,我的函数
def parser(value_from_the_wire): ...想使用一些本机值(例如整数或字符串等),而不是使用 Enum 成员。这是 Python 3 中标准枚举中的棘手部分:-
assert 2 == MY_ENUM.MY_VALUE仅在 MY_ENUM 派生自IntEnum时才有效(并且没有默认的StrEnum,尽管自己子类化并不困难) -
assert 2 in MY_ENUM不起作用,即使 MY_ENUM 派生自IntEnum。
-
【问题讨论】:
-
我不明白您的问题与您链接的问题有何不同。为什么那里的答案不回答你的问题?
-
@Aran-Fey 这些问题都没有明确要求,因此,他们的答案往往基于不同回答者心中的不同假设。
-
嗯?有什么要澄清的?我认为“我如何表示枚举”这个问题很清楚。你的枚举能做什么而现有答案中的其他枚举不能?
-
好吧,当我发布这个问答时,至少我做了功课。你在发布你的 cmets 之前做了你的吗?大多数天真的解决方案
class MY_ENUM: NAME1 = "value1"不满足我的要求#3,即允许if input_value in MY_ENUM: ...检查。其他一些人假设“如果您需要数值,这是最快的方法:dog, cat, rabbit = range(3)”,这不是我想要的。等等等等。 -
你是认真的吗?您列出的所有问题都与该问题无关。只有当您选择了一种不好的方式来表示您的枚举时,这些问题才会存在。所有这些都是答案的问题,而不是问题。如果您看到错误的答案,请投反对票。您的问题与其他问题没有任何不同。