首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flask-restx将body中的json字段转换为枚举

使用flask-restx将body中的json字段转换为枚举
EN

Stack Overflow用户
提问于 2021-07-28 16:46:40
回答 1查看 73关注 0票数 0

我有以下用于flask-restx的api定义(尽管也应该使用flask-restplus)。有没有办法将请求体中的enum-field转换为枚举MyEnum,而不需要太多开销或使用DAOs?

代码语言:javascript
复制
class MyEnum(Enum):
    FOO = auto()
    BAR = auto()


@dataclass(frozen=True)
class MyClass:
    enum: MyEnum


api = Namespace('ns')

model = api.model('Model', {
    'enum': fields.String(enum=[x.name for x in MyEnum]),
})

@api.route('/')
class MyClass(Resource):

    @api.expect(Model)
    def post(self) -> None:
        c = MyClass(**api.payload)
        print(type(c.enum))  # <class 'str'> (but I want <enum 'MyEnum'>)
        assert(type(c.enum) == MyEnum)  # Fails
EN

回答 1

Stack Overflow用户

发布于 2021-07-28 21:02:39

好了,我已经写了一个装饰器,它将用枚举替换枚举值

代码语言:javascript
复制
def decode_enum(api: Namespace, enum_cls: Type[Enum], keys: List[str]):
    def replace_item(obj: dict, keys_: List[str], new_value: Type[Enum]):
        if not keys_:
            return new_value
        obj[keys_[0]] = replace_item(obj[keys_[0]], keys_[1:], new_value)
        return obj

    def decoder(f):
        @wraps(f)
        def wrapper(*args, **kwds):
            value = api.payload
            for k in keys:
                value = value[k]
            enum = enum_cls[value]
            api.payload[keys[0]] = replace_item(api.payload[keys[0]], keys[1:], enum)
            return f(*args, **kwds)
        return wrapper
    return decoder

用法如下所示

代码语言:javascript
复制
@decode_enum(api, MyEnum, ['enum'])
@api.expect(Model)
def post(self) -> None:
    c = MyClass(**api.payload)
    print(type(c.enum))  # <enum 'MyEnum'>

replace_item函数的灵感来自于此,所以答案是:https://stackoverflow.com/a/45335542/6900162

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68557175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档