我已经创建了这样的Enum
对象:
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表达式的情况下每次都获得随机值?
我们使用这个枚举对象作为某个方法的参数的默认值,这就是为什么它应该是一个属性,而不是一个函数,因为当我们使用Gender.FEMALE
时,它不是一个函数,它是一个属性,而Gender.RANDOM
也应该是一个属性:
def full_name(gender=Gender.FEMALE):
...
def full_name(gender=Gender.RANDOM):
...
发布于 2017-11-17 23:16:28
我和metaclasses试过一种方法。而且它起作用了!
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
作为Gender
的元类,Gender
就像是RANDOM_ATTR
类的对象,所以Gender
具有property RANDOM
。
然而,您在问题中描述的以下代码并不能以您预期的方式工作。
def full_name(gender=Gender.RANDOM):
...
RANDOM
属性将只被调用一次。要了解原因,请阅读此answer。默认参数就像函数的属性,它只会被初始化一次。
为此,我建议您这样做:
def full_name(gender=None):
gender = gender or Gender.RANDOM
...
发布于 2017-11-17 23:12:41
您可能应该在Enum
中创建一个方法来获取随机性别:
import random
import enum
class Gender(enum.Enum):
FEMALE = 'female'
MALE = 'male'
@classmethod
def get_gender(cls):
return random.choice([Gender.FEMALE, Gender.MALE])
Gender.get_gender()
发布于 2017-11-17 23:16:58
尽管在许多情况下修改类可能更清晰、更干练,但如果你只做一次,或者不想修改枚举,你可以这样做:
random.choice([enm.value for enm in Gender])
https://stackoverflow.com/questions/47353555
复制相似问题