【发布时间】:2018-05-18 05:56:25
【问题描述】:
我正在使用一个基于图形的框架,该框架由多种类型的节点和关系组成。这些类型中的每一种都有一些我希望能够轻松访问的元属性。为了表示这些类型,我认为枚举将是要走的路。
我对 Python 还是比较陌生,但我知道其他语言(如 Java)的枚举。我想这个问题真的归结为这是否是 Python 中枚举的一个很好的使用。我代表我的类型是这样的:
class Grammar(Enum):
VERB = 'verb'
NOUN = 'noun'
# END Grammar
class _Word():
def __init__(self, name, meta):
self.name = name
self.meta = meta
# END __init__
# END _Word
class Word(Enum):
TYPE_A = _Word('foo', Grammar.VERB)
TYPE_B = _Word('bar', Grammar.NOUN)
# END Word
所以我的每个 Word 值都分配了一个 _Word 对象,这是一个复杂类型。这在大多数使用 Enum 的情况下都可以正常工作。但是,我的同事注意到 Spyder 在检查存在枚举实例的对象时会引发异常:ValueError(): is not a valid Word(请注意冒号后面的空格)。
这让我觉得我使用枚举的方式并不是最佳实践。我错过了什么吗?
【问题讨论】:
-
如果不完全了解您要完成的工作,很难说。我从未见过 Enums 用于跟踪任何比简单的簿记更复杂的关系集。在 Python3.4 之前,枚举甚至不是一种语言特性,因此该语言显然没有将它们设计为必要的结构,而是为了方便而添加了更多。您想准确捕捉哪些关系?
-
我认为这是一个有效的表示,但是,如果框架 API 没有启用它,您可能需要问自己为什么需要访问类型的元属性......也许你没有按预期使用框架,或者,也许你不应该使用一个?
-
我正在尝试捕获我的图形框架的语义。例如,将节点视为单词,将图形视为句子。对于我的每一句话,我都想知道它的定义,例如不管是动词还是名词。由于框架的语义不应该随着时间而改变,我认为将其建模为枚举常量很有意义。编辑:我所说的框架并不是一个 python 库,而是一组关于如何使用节点和关系类型的规则(如果你愿意的话,一个语法)
-
@thijsfranck:你能用动词/名词/语法风格而不是 a/b/foo/bar 风格重做你的例子吗?很难看出你实际上想用通用名称来完成什么。
-
这很好。我改变了我的例子!