Python中如何遍历不同Enum类组合并实现可扩展迭代?
解决方案
要实现可扩展的iterate()函数,核心思路是动态获取InputPermutation的参数类型注解,自动收集每个参数对应的Enum成员,再生成所有组合的笛卡尔积,这样无论新增Enum属性还是扩展Enum选项,函数都能自动适配。
完整代码实现:
from enum import Enum import itertools import inspect class Colour(Enum): GREEN = "green" BLUE = "blue" RED = "red" class Country(Enum): ENGLAND = "england" JAPAN = "japan" AUSTRALIA = "australia" class InputPermutation: def __init__(self, colour: Colour, country: Country): self.colour = colour self.country = country def main(input_permutation: InputPermutation) -> dict: colour = input_permutation.colour.value country = input_permutation.country.value result = {colour: country} return result def iterate() -> dict: # 提取InputPermutation构造函数的参数类型(排除self) sig = inspect.signature(InputPermutation.__init__) enum_groups = [] for param in sig.parameters.values(): if param.name == "self": continue # 获取参数对应的Enum类,并收集所有成员实例 enum_cls = param.annotation enum_groups.append(list(enum_cls)) # 生成所有Enum组合的笛卡尔积 all_combinations = itertools.product(*enum_groups) # 遍历组合,执行main并构建结果字典 run_results = {} for run_idx, combo in enumerate(all_combinations, start=1): permutation = InputPermutation(*combo) run_results[run_idx] = main(permutation) return run_results
关键逻辑说明
- 动态获取参数类型:通过
inspect.signature解析InputPermutation.__init__的参数,自动获取每个参数对应的Enum类,不需要硬编码参数名或Enum类型。 - 生成笛卡尔积:用
itertools.product将所有Enum的成员做全组合,确保覆盖所有可能的配置。 - 自动适配扩展:
- 若
InputPermutation新增属性(比如加size: Size,其中Size是新Enum),函数会自动识别新参数并加入组合。 - 若现有Enum新增选项(比如
Colour加YELLOW),函数会自动包含该选项到所有相关组合中。
- 若
运行结果示例
调用iterate()会返回符合要求的字典:
{ 1: {'green': 'england'}, 2: {'green': 'japan'}, 3: {'green': 'australia'}, 4: {'blue': 'england'}, 5: {'blue': 'japan'}, 6: {'blue': 'australia'}, 7: {'red': 'england'}, 8: {'red': 'japan'}, 9: {'red': 'australia'} }
内容的提问来源于stack exchange,提问作者k_1223
相关产品推荐
相关产品推荐

