【问题标题】:Enum member as a default value on signature枚举成员作为签名的默认值
【发布时间】:2022-11-16 02:55:53
【问题描述】:

我知道将可变对象分配为函数的默认值是不好的做法。

就像是:

def foo(a = []):
   pass

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

就像是:

Class SomeEnum(Enum)
   ENUM_KEY = SomeClass()

def foo(a = SomeEnum.ENUM_KEY)
    pass

【问题讨论】:

  • SomeEnum.ENUM_KEYSomeEnum 的一个实例,它是可变的。 SomeEnum.ENUM_KEY.value (SomeClass()) (一般来说)也是可变的。通过可变性,你指的是哪个对象?更具体地说,例如,如果SomeClass = int,您的问题是否仍然存在?顺便说一下,第二个代码 sn-p 不是有效的 python 代码。请检查语法。
  • 默认参数的类型是什么并不重要。重要的是函数是否在没有意识到的情况下改变了它全部未来对该函数的调用将看到突变。
  • 如果fooa视为不可变值,则使用[]作为a的默认参数值没有问题。

标签: python enums mutable


【解决方案1】:

使用枚举成员作为默认参数(通常)没问题。

枚举成员的 value 通常是常量(例如 1debugMonday),但也可以使用可变值,例如空列表。如果您要在函数中改变枚举的值,那么您将面临与直接使用可变默认值相同的风险。

【讨论】:

  • 您的第二段(正确)与您的第一句话相矛盾。它可能可以使用 enum 成员作为默认参数,但出于与任意值相同的原因任何类型可能没问题。
  • @chepner:好点,更正了第一句话。
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多