枚举成员作为签名的默认值

Enum member as a default value on signature

提问人:amit 提问时间:11/15/2022 更新时间:11/16/2022 访问量:170

问:

我知道将可变对象指定为函数的默认值是不好的。

像这样:

def foo(a = []):
   pass

我的问题是分配枚举成员也是一种不好的做法?

像这样:

Class SomeEnum(Enum)
   ENUM_KEY = SomeClass()

def foo(a = SomeEnum.ENUM_KEY)
    pass

枚举 可变

评论

0赞 Luting Wang 11/15/2022
SomeEnum.ENUM_KEY是 的实例,它是可变的。 () (一般来说)也是可变的。通过可变性,您究竟指的是哪个对象?更具体地说,例如,如果?顺便说一句,第二个代码片段不是有效的 python 代码。请检查语法。SomeEnumSomeEnum.ENUM_KEY.valueSomeClass()SomeClass = int
1赞 chepner 11/16/2022
默认参数的类型无关紧要。重要的是,如果函数在不意识到将来对函数的所有调用都将看到突变的情况下对其进行了突变。
0赞 chepner 11/16/2022
如果将其视为不可变值,则用作 的默认参数值没有问题。fooa[]a

答:

0赞 Ethan Furman 11/16/2022 #1

使用枚举成员作为默认参数(通常)是可以的。

枚举成员通常是常量的(例如 、 或 ),但也可以使用可变值,例如空列表。如果要在函数中更改枚举的值,则具有与直接使用可变默认值相同的风险。value1debugMonday

评论

0赞 chepner 11/16/2022
你的第二段(是正确的)与你的第一句话相矛盾。使用成员作为默认参数可能是可以的,但出于同样的原因,任何类型的任意值都可以。enum
0赞 Ethan Furman 11/16/2022
@chepner:说得好,第一句话更正了。