python3中按属性获取复杂枚举+

2024-09-30 00:39:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有复杂的pythonenum,如下所示:

from enum import Enum

class Properties:
    def __init__(self, name, v, k):
        self.name = name
        self.v = v
        self.k = k


class EnzymeNames(Enum):
    ENZYME_X = Properties("x", 0.2, 50)
    ENZYME_Y = Properties("y", 1.5, 100)

    @property
    def v(self):
        return self.value.v

    @property
    def k(self):
        return self.value.k

    def __str__(self):
        return self.value.name

现在,我有一个特殊的函数,通过它的名称来获取enum

^{pr2}$

我想知道有没有什么简单的/Python式的方法可以通过EnzymeNames('name')或者类似的方法来访问{}?在

编辑

我想对于我要达到的目标没有什么困惑。我想通过属性得到酶名。例如,EnzymeNames('x')应该给出酶名.酶。在

我已经尝试过以下方法:

>>EnzymeNames('x')
ValueError: 'x' is not a valid EnzymeNames
>>EnzymeNames('ENZYME_X') 
ValueError: 'ENZYME_X' is not a valid EnzymeNames
>>EnzymeNames['ENZYME_X']
KeyError: 'ENZYME_X' 

Tags: 方法nameselfreturnisvaluedefproperty
2条回答

我建议您对代码稍作重组以使用namedtuples。它们是轻量级的,易于创建像enums这样不可变的对象。请看this post以获得比我能把它们放在一起更好的解释。在

下面是添加了两个方法的代码,通过Properties属性值检索实例。在

代码:

from enum import Enum
import collections
import math

Properties = collections.namedtuple('Properties', 'v k')

class EnzymeNames(Enum):
    x = Properties(0.2, 50)
    y = Properties(1.5, 100)

    @property
    def v(self):
        return self.value.v

    @property
    def k(self):
        return self.value.k

    @classmethod
    def from_v(cls, v):
        for en in cls:
            if math.isclose(en.v, v):
                return en

    @classmethod
    def from_k(cls, k):
        for en in cls:
            if math.isclose(en.k, k):
                return en

测试代码:

^{pr2}$

输出:

EnzymeNames.y
name: y
k: 100
v: 1.5

你在用哪一个?{3.3.3和你的测试代码

>>> EnzymeNames['ENZYME_X']
x

换句话说:使用内置的Enumenum34后端口,您的代码可以正常工作。在


编写枚举的更好方法是将Properties集成到其中:

^{pr2}$

使用中:

>>> print(EnzymeNames.X)
X

>>> print(EnzymeNames.X.name)
X

>>> print(EnzymeNames.X.v)
0.2

>>> print(EnzymeNames.X.k)
50

>>> print(EnzymeNames['X'])
X

编写enums的一些一般提示:

  • 保持名称单数;EnzymeName而不是EnzymeNames
  • 不要在枚举成员中重复枚举名称:X而不是ENZYME_X
  • 如果您正在使用Enum做一些花哨的事情,可以考虑使用^{}(由与Enum和{}同一作者编写)

使用aenum,您的代码可能看起来像:

from aenum import Enum

class EnzymeName(Enum, init='v k'):

    X = 0.2, 50
    Y = 1.5, 100

    def __str__(self):
        return self.name

相关问题 更多 >

    热门问题