<p>此解决方案满足您的需要</p>
<p><code>get_by_values</code>类方法可以接收一个列表,或者包含您想要满足的任何值组合的列表列表。它保证只返回完全满足您传入的组合之一的成员。它返回<code>set</code>个<code>Enum</code>成员,因此保证没有任何重复。如果在返回中使用列表,则会得到与传入的每个参数对应的有序结果</p>
<p><code>Variable</code>成员已经有了<code>Variable.name</code>您可以用它们声明。如果你想要更具表现力的东西,我会选择<code>__str__</code>或<code>__init__</code>,也许会结合<code>VariableCategory.name</code>和<code>VariableType.name</code></p>
<pre class="lang-py prettyprint-override"><code>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
</code></pre>
<p><strong>编辑:</strong>将的替换为集合理解。扩展的for部分如下所示:</p>
<pre class="lang-py prettyprint-override"><code>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
</code></pre>