跳到内容

replace-str-enum (UP042)

源自 pyupgrade linter。

有时提供修复。

此规则不稳定且处于预览状态。使用需要 --preview 标志。

作用

检查同时继承自 strenum.Enum 的类。

为什么这不好?

Python 3.11 引入了 enum.StrEnum,它比同时继承 strenum.Enum 更受推荐。

示例

import enum


class Foo(str, enum.Enum): ...

建议改为

import enum


class Foo(enum.StrEnum): ...

修复安全性

Python 3.11 为同时继承 strenum.Enum 的枚举引入了一个重大变更。考虑以下枚举

from enum import Enum


class Foo(str, Enum):
    BAR = "bar"

在 Python 3.11 中,Foo.BAR 的格式化表示形式发生了如下变化

# Python 3.10
f"{Foo.BAR}"  # > bar
# Python 3.11
f"{Foo.BAR}"  # > Foo.BAR

strenum.Enum 迁移到 enum.StrEnum 将恢复之前的行为,例如

from enum import StrEnum


class Foo(StrEnum):
    BAR = "bar"


f"{Foo.BAR}"  # > bar

因此,迁移到 enum.StrEnum 将为依赖于 Python 3.11 行为的代码引入行为更改。

参考