【问题标题】:How to parse enums by value from query parameters using webargs?如何使用 webargs 从查询参数中按值解析枚举?
【发布时间】:2021-01-17 15:55:36
【问题描述】:

我有下一个枚举:

class EStatus(enum.IntEnum):
    NEW = 0
    MODIFIED = 1

和架构:

ARGS = {
    'status': EnumField(EStatus, by_value=True, required=False)
}

在 Flask 之后,我使用 webargs 声明了 GET 方法:

@use_args(ARGS, location='query')
def get(self, args: Dict[str, any]):
    return []

它失败并出现错误:

{'messages': {'query': {'status': ['Invalid enum value 1']}}, 'schema': <GeneratedSchema(many=False)>, 'headers': None}

我在调试器中检查过,发现EnumField 调用了EStatus(value)。问题是我的值是 str 类型,因为它来自查询参数。

如何在调用EStatus(value)之前将其转换为int

【问题讨论】:

    标签: python flask python-3.7 flask-marshmallow webargs


    【解决方案1】:
    class EStatus(enum.IntEnum):
        NEW = 0
        MODIFIED = 1
    
      @staticmethod
        def from_str(e_status: str):
            e_status = e_status.upper()
            if e_status in EStatus.__members__:
                return EStatus[e_status]
            else:
                raise ValueError(f'{e_status} is not a valid EStatus.')
    
    #You can use above from_str like below,
    EStatus e_status = EStatus.from_str('NEW')
    print(e_status.name)
    print(e_status.value)
    

    希望对于您的问题,您应该能够使用 from_str 静态方法将 str 转换为 Enum 类型。

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多