我创建了这样的对象:
class Gender(Enum):
FEMALE = 'female'
MALE = 'male'
RANDOM = random.choice([FEMALE, MALE])
我想每次都得到真正的随机值,但它不起作用:
>>> class Gender(Enum):
... MALE = 'male'
... FEMALE = 'female'
... RANDOM = choice([MALE, FEMALE])
...
>>> Gender.RANDOM
<Gender.MALE: 'male'>
>>> Gender.RANDOM
<Gender.MALE: 'male'>
>>> Gender.RANDOM
<Gender.MALE: 'male'>
>>> Gender.RANDOM
<Gender.MALE: 'male'>
我也尝试过使用lambda,但是它看起来不太好,尽管它可以工作:
Gender.RANDOM()
是否有其他方法可以在不使用lambda表达式的情况下每次获取随机值?
我们使用这个枚举对象作为某个方法的参数的默认值,这就是为什么它应该是一个属性而不是一个函数,因为当我们使用
Enum
它不是一个函数时,它是一个属性而Gender.FEMALE
也应该是一个属性:def full_name(gender=Gender.FEMALE):
...
def full_name(gender=Gender.RANDOM):
...
最佳答案
我尝试了一种方法。而且它是有效的!
import random
import enum
class RANDOM_ATTR(enum.EnumMeta):
@property
def RANDOM(self):
return random.choice([Gender.MALE, Gender.FEMALE])
class Gender(enum.Enum,metaclass=RANDOM_ATTR): #this syntax works for python3 only
FEMALE = 'female'
MALE = 'male'
print(Gender.RANDOM) #prints male or female randomly
在这里,通过使
RANDOM_ATTR
的元类类似于classGender
的对象,因此Gender
具有metaclassesRANDOM_ATTR
。但是,您在问题中描述的下面的代码并不像您期望的那样工作。
def full_name(gender=Gender.RANDOM):
...
Gender
属性将只调用一次。要知道原因,请阅读此property。默认参数类似于函数的属性,只初始化一次。为此,我建议你做如下的事情:
def full_name(gender=None):
gender = gender or Gender.RANDOM
...