为了账号安全,请及时绑定邮箱和手机立即绑定

按成员值从python枚举中选择

按成员值从python枚举中选择

慕容708150 2022-07-12 17:44:41
如何获取满足给定但未知字段标准的枚举类的所有实例?我有以下三个派生自 的类Enum,两个简单的 (VariableType和VariableCategory) 和一个,其中实例实际上将内容存储在字段 ( Variable) 中。class VariableCategory(Enum):    SHORT = auto()    MEDIUM = auto()    LONG = auto()class VariableType(Enum):    ONE = auto()    TWO = auto()class Variable(Enum):    A = ('Variable A',           VariableCategory.SHORT,           VariableType.ONE,           1)    B = ('Variable B',           VariableCategory.MEDIUM,           VariableType.TWO,           2)    C = ('Variable V',           VariableCategory.SHORT,           VariableType.TWO,           3)    def __init__(self, name: str, variable_category: VariableCategory, variable_type: VariableType,                 number:int) -> None:        self.name = name        self.variable_category = variable_category        self.variable_type = variable_type        self.number = number现在,我想创建一个类函数,它可以采用任意类型的参数VariableType或VariableCategory返回所有对应的实例Variable:@classmethoddef by_x(cls, x: Union[VariableType, VariableCategory]):    # something like return [cls[member] for member in cls.__members__ if x in cls[member]]例如,给定VariableType的相应实例Variable,如:>>> Variable.by_x(VariableType.ONE)    [Variable.A]>>> Variable.by_x(VariableType.TWO)    [Variable.B, Variable.C]>>> Variable.by_x(VariableCategory.SHORT)    [Variable.A, Variable.C]>>> Variable.by_x(VariableCategory.MEDIUM)    [Variable.B]>>> Variable.by_x(VariableCategory.LONG)    []我也知道,我可以对Variable枚举的一个字段使用更具体的函数:@classmethoddef by_variable_type(cls, variable_type: VariableType) -> List['Variable']:    return [cls[member] for member in cls.__members__ if cls[member].variable_type == variable_type]但是,我不知道如何只制作一个通用函数而不是许多特定函数(即,不检查参数的类型并相应地调用特定的解决方案)。
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

    @classmethod

    def by_x(cls, criterion):

        return [

                m

                for m in cls

                if m.variable_category == criterion

                    or m.variable_type == criterion

                    ]

顺便说一句,您不能分配给self.name- 它会引发AttributeError.


查看完整回答
反对 回复 2022-07-12
?
慕娘9325324

TA贡献1783条经验 获得超5个赞

该解决方案可以满足您的需求。


类get_by_values方法可以接收一个列表,或者具有您想要满足的任何值组合的列表列表。它保证只返回完全满足您传入的组合之一的成员。它返回一个set成员Enum,因此保证没有任何重复。如果您在返回中使用列表,您将获得与您传入的每个参数相对应的有序结果。


Variable成员已经有Variable.name你声明他们。如果您想要更具表现力的东西,我会选择__str__or ,也许与and__init__结合使用。VariableCategory.nameVariableType.name


from enum import Enum, auto



class VariableCategory(Enum):

    SHORT = auto()

    MEDIUM = auto()

    LONG = auto()



class VariableType(Enum):

    ONE = auto()

    TWO = auto()



class Variable(Enum):

    A = VariableCategory.SHORT, VariableType.ONE

    B = VariableCategory.MEDIUM, VariableType.TWO

    C = VariableCategory.SHORT, VariableType.TWO


    def __init__(self, variable_category: VariableCategory, variable_type: VariableType):

        self.variable_category = variable_category

        self.variable_type = variable_type


    def in_value(self, argument):

        if set(argument).issubset(set(self.value)):

            return self


    @classmethod

    def get_by_values(cls, *args):

        return {member for member in cls

                if member in {member.in_value(arg) for arg in args}}



first = [VariableCategory.SHORT, VariableType.ONE]

second = [VariableCategory.SHORT]


print(*Variable.get_by_values(first, second))

# Variable.A Variable.C


print(*Variable.get_by_values([VariableCategory.MEDIUM]))

# Variable.B


print(*Variable.get_by_values([VariableType.TWO]))

# Variable.B Variable.C

编辑:用集合推导替换 for。扩展的部分如下:


def in_value(self, argument):


    for element in argument:

        if element not in self.value:

            return False


    return True


@classmethod

def get_by_values(cls, *args):

    result = list()


    for one_member in Variable:

        for argument in args:

            if one_member.in_value(argument):

                if one_member not in result:

                    result.append(one_member)


    return result


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号