我一直在关注Python3.11中关于Enum格式化的来回讨论,参见https://github.com/python/cpython/issues/100458.

然而,我有一些与实现__str__的类的混合,并且在3.11的次要版本中看到了不一致的行为,特别是3.11.0-3.11.3.

使用以下脚本,在3.10年末到3.12年初的几个不同版本上运行:

import enum


class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __str__(self):
        return f'{self.a}|{self.b}'


class Foo(A, enum.Enum):
    BAR = 'a', 'b'

import sys

print(sys.version)
print(Foo.BAR)
print(str(Foo.BAR))
print("%s" % Foo.BAR)
print(f"{Foo.BAR}")
print("{}".format(Foo.BAR))

输出:

3.10.13 (main, Oct 25 2023, 19:27:56) [Clang 15.0.0 (clang-1500.0.40.1)]
a|b
a|b
a|b
a|b
a|b

3.11.0 (main, Oct 25 2023, 19:22:31) [Clang 15.0.0 (clang-1500.0.40.1)]
Foo.BAR
Foo.BAR
Foo.BAR
Foo.BAR
Foo.BAR

3.11.3 (main, Oct 25 2023, 12:37:31) [Clang 15.0.0 (clang-1500.0.40.1)]
Foo.BAR
Foo.BAR
Foo.BAR
Foo.BAR
Foo.BAR

3.11.4 (main, Oct 25 2023, 00:36:48) [Clang 15.0.0 (clang-1500.0.40.1)]
a|b
a|b
a|b
a|b
a|b

3.11.6 (main, Oct 25 2023, 12:41:05) [Clang 15.0.0 (clang-1500.0.40.1)]
a|b
a|b
a|b
a|b
a|b

3.12.0 (main, Oct 25 2023, 19:30:35) [Clang 15.0.0 (clang-1500.0.40.1)]
a|b
a|b
a|b
a|b
a|b

我只是想确认3.11.0-3.11.3版本是某种已经修复的回归,并且预期的行为是future 的3.11.4+行为.

推荐答案

3.11.4+的行为是正确的.


披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者.

Python相关问答推荐

使用itertools出现第n个子串

合并其中一个具有重叠范围的两个框架的最佳方法是什么?

自动编码器和极坐标

从Python调用GMP C函数时的分段错误和内存泄漏

从 struct 类型创建MultiPolygon对象,并使用Polars列出[list[f64]列

Tkinter -控制调色板的位置

从今天起的future 12个月内使用Python迭代

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

返回nxon矩阵的diag元素,而不使用for循环

Python库:可选地支持numpy类型,而不依赖于numpy

如何在WSL2中更新Python到最新版本(3.12.2)?

实现自定义QWidgets作为QTimeEdit的弹出窗口

将输入聚合到统一词典中

无法连接到Keycloat服务器

Python Pandas获取层次路径直到顶层管理

如何更改groupby作用域以找到满足掩码条件的第一个值?

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

如何找出Pandas 图中的连续空值(NaN)?

使用Openpyxl从Excel中的折线图更改图表样式

Numpyro AR(1)均值切换模型抽样不一致性