亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按成員值從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 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號