首页 > 解决方案 > Python:将枚举作为参数传递给另一个类

问题描述

我正在处理一段代码,我在其中使用 Enum 为属性定义一组可能的值。我想在实例化另一个类时使用它来明确设置它的设置方式。但是,它不能可靠地工作。
我现在知道扩展枚举存在问题,但这里似乎并非如此。请看一下代码..:

from enum import Enum


class SpecScanParamType(Enum):
    NUM_ACCUMULATIONS = 0
    INTEGRATION_TIME = 1
    LASER_POWER = 2
    AUTOFOCUS = 3
    SPECTRA_BATCH_SIZE = 4


class SpecScanParameter:
    def __init__(self, name: str, paramType: SpecScanParamType):
        self.name: str = name
        self.paramType: SpecScanParamType = paramType


a = SpecScanParameter('test', SpecScanParamType.LASER_POWER)  # works
b = [SpecScanParameter('test', SpecScanParamType.NUM_ACCUMULATIONS),  # works
     SpecScanParameter('nee', SpecScanParamType.SPECTRA_BATCH_SIZE)]  # works

c = [SpecScanParameter('test', SpecScanParamType.INTEGRATION_TIME),  # works
     SpecScanParameter('nee', SpecScanParamType.NUM_ACCUMULATIONS),  # works
     SpecScanParamType('test2', SpecScanParamType.SPECTRA_BATCH_SIZE)]  # DOES NOT WORK????


specScanParameters = [SpecScanParameter('Integration Time (s)', SpecScanParamType.INTEGRATION_TIME),  # works
                      SpecScanParamType('Number of Scans', SpecScanParamType.NUM_ACCUMULATIONS),  # Does not work
                      SpecScanParamType('Spectra Batch Size', SpecScanParamType.SPECTRA_BATCH_SIZE)]  # not reachable...

Sooo,前几个变体没有问题。但是,如果我想创建一个参数列表,它会在不同的位置失败,或者当列表中已经有一个或两个时..我无法识别任何模式......啊,引发的错误是这个:

TypeError: Cannot extend enumerations

所以问题在某种程度上与扩展 Enums 限制有关,但为什么它在某些情况下有效?任何帮助或提示将不胜感激!我真的很想在这个位置使用枚举,因为它使很多地方的代码更具可读性!

标签: pythonenumsconstructorarguments

解决方案


这可能是因为在某些情况下您使用SpecScanParamType的是代替。SpecScanParameter例如:

c = [SpecScanParameter('test', SpecScanParamType.INTEGRATION_TIME),  # works
     SpecScanParameter('nee', SpecScanParamType.NUM_ACCUMULATIONS),  # works
     SpecScanParamType('test2', SpecScanParamType.SPECTRA_BATCH_SIZE)]  # DOES NOT WORK????

看来,应该是:

c = [SpecScanParameter('test', SpecScanParamType.INTEGRATION_TIME),  # works
     SpecScanParameter('nee', SpecScanParamType.NUM_ACCUMULATIONS),  # works
     SpecScanParameter('test2', SpecScanParamType.SPECTRA_BATCH_SIZE)]  # works

推荐阅读