【问题标题】:Python: Pass Enum as Argument to another class [closed]Python:将枚举作为参数传递给另一个类[关闭]
【发布时间】:2021-01-19 17:07:34
【问题描述】:

我正在编写一段代码,我在其中使用 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 限制有关,但为什么它在某些情况下有效? 任何帮助或提示将不胜感激!我真的很想在这个位置使用 Enum,因为它使很多地方的代码更具可读性!

【问题讨论】:

  • “无法访问”是什么意思?如果您一次将它们添加到列表中,会发生什么?
  • 你想做什么?在标记为# DOES NOT WORK???? 的行上,您正在创建SpecScanParamType 的实例,这就是您收到此错误的原因。您的意思是创建SpecScanParameter 的实例吗?

标签: python enums constructor arguments


【解决方案1】:

这可能是因为在某些情况下您使用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

【讨论】:

  • 我很想知道投反对票的原因。这里到底出了什么问题?
  • 啊啊啊啊啊啊天啊!感谢您指出显而易见的!啊,为什么你不应该在周日晚上工作的经典案例……谢谢伙计! (我也不知道为什么有人投了反对票——你的答案再正确不过了!)
  • 请不要回答错字问题。它们对网站没有持久的价值,它们应该被关闭和删除。您可以用您当前的声誉标记它们,并且一旦达到 3k 代表就可以投票关闭它们。在 OP 问题下的评论足以帮助他。回答他们的问题是,如果答案被投票,系统不能再自动删除问题,需要几个用户的手动干预。所以,请帮助我们保持网站的清洁和实用!
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2012-04-18
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2013-10-13
相关资源
最近更新 更多