gpt4 book ai didi

python - Django FactoryBoy - 随机选择不适用于 LazyFunction

转载 作者:行者123 更新时间:2023-12-05 08:40:28 28 4
gpt4 key购买 nike

我正在为我们的 django 应用程序构建大量测试,我正在使用 FactoryBoy

Profile 模型有一个gender 字段,定义如下:

class Profile(models.Model):

GENDER_CHOICES = (
(u'm', _(u'Male')),
(u'f', _(u'Female')),
)

gender = models.CharField(
max_length=2, choices=GENDER_CHOICES, verbose_name=_("Gender"),
null=True, blank=True
)

我想用下面这行代码在 factory boy 中随机化这个字段的值:

class ProfileFactory(factory.Factory):
(...)
gender = factory.LazyFunction(random.choice(['f', 'm']))

但是,这会抛出一个 TypeError: 'str' object is not callable 错误然后我使用旧的博客文章尝试了以下有效的解决方案:

gender = factory.LazyAttribute(lambda x: random.choice(['f', 'm']))

这解决了问题,但我不清楚为什么会这样。

documentation对于 factory.LazyFunction 声明:

The LazyFunction is the simplest case where the value of an attribute
does not depend on the object being built.

It takes as argument a method to call (function, lambda…); that method
should not take any argument, though keyword arguments are safe but
unused, and return a value.

据我了解,random.choice(['f', 'm']) 构成了一个方法调用,因此应该按我的预期工作。

但我对 LazyFunction 的理解显然有缺陷,我希望有人能解释我在这里做错了什么

最佳答案

两者的区别在于

lambda x: random.choice(['f', 'm'])

返回一个函数并

random.choice(['f', 'm'])

评估语句并返回字符串。

如果您要在没有 lambda 的情况下复制行为,您可以使用

def foo():
return random.choice(['f', 'm'])

# ...
gender = factory.LazyFunction(foo)

关于python - Django FactoryBoy - 随机选择不适用于 LazyFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55126058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com