首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在每次迭代中获取Enum属性的随机值?

如何在每次迭代中获取Enum属性的随机值?
EN

Stack Overflow用户
提问于 2017-11-17 22:59:21
回答 4查看 3.4K关注 0票数 20

我已经创建了这样的Enum对象:

代码语言:javascript
复制
class Gender(Enum):
    FEMALE = 'female'
    MALE = 'male'
    RANDOM = random.choice([FEMALE, MALE])

我想每次都得到真正的随机值,但它不起作用:

代码语言:javascript
复制
>>> 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,但它看起来不是很好,尽管它很有效:

代码语言:javascript
复制
Gender.RANDOM()

有没有其他方法可以在不使用lambda表达式的情况下每次都获得随机值?

我们使用这个枚举对象作为某个方法的参数的默认值,这就是为什么它应该是一个属性,而不是一个函数,因为当我们使用Gender.FEMALE时,它不是一个函数,它是一个属性,而Gender.RANDOM也应该是一个属性:

代码语言:javascript
复制
def full_name(gender=Gender.FEMALE):
    ...


def full_name(gender=Gender.RANDOM):
    ...
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-17 23:16:28

我和metaclasses试过一种方法。而且它起作用了!

代码语言:javascript
复制
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

然而,您在问题中描述的以下代码并不能以您预期的方式工作。

代码语言:javascript
复制
def full_name(gender=Gender.RANDOM):
    ...

RANDOM属性将只被调用一次。要了解原因,请阅读此answer。默认参数就像函数的属性,它只会被初始化一次。

为此,我建议您这样做:

代码语言:javascript
复制
def full_name(gender=None):
    gender = gender or Gender.RANDOM
    ...
票数 7
EN

Stack Overflow用户

发布于 2017-11-17 23:12:41

您可能应该在Enum中创建一个方法来获取随机性别:

代码语言:javascript
复制
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()
票数 3
EN

Stack Overflow用户

发布于 2017-11-17 23:16:58

尽管在许多情况下修改类可能更清晰、更干练,但如果你只做一次,或者不想修改枚举,你可以这样做:

random.choice([enm.value for enm in Gender])

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47353555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档