gpt4 book ai didi

python - factory_boy 提取原始 kwargs

转载 作者:行者123 更新时间:2023-11-28 17:15:21 25 4
gpt4 key购买 nike

我正在使用 factory_boy 构建一个工厂,它生成一个 django 模型。我想看看用户内联输入了哪些参数。我的工厂本身看起来像这样

class SomeFactory(factory.django.DjangoModelFactory):

name = factory.Sequence(lambda n: 'Instance #{}'.format(n))
some_other_thing = factory.SubFactory(SomeOtherFactory)

class Meta:
model = SomeModel

现在用户可以说 s = SomeFactory() 并且它可以正常工作,但我想检测用户是否输入了他们自己的参数。例如,判断用户是否输入了自己的名字,如 s = SomeFactory(name='Matt')

到目前为止我尝试过的是

  • SomeFactory 类中编写我自己的 __init__ 函数
    • 这会神秘地被覆盖,并且在我调用 s = SomeFactory() 或调用 s.__init__()
    • 时都不会调用
  • 覆盖 __new__ 方法也是如此
  • 覆盖命名不当的 _adjust_kwargs
    • 这为我提供了所有字段作为 kwargs,而不仅仅是用户定义的字段。例如,调用 s = SomeFactory(name='Matt'),我会得到一个 kwargs 字典,其中包含 name 的键some_other_thing,这使得无法判断输入是否有自己的参数
  • 覆盖_create
    • 在覆盖 _adjust_kwargs 时仍然会遇到同样的问题,因为 kwargs 不包含原始的 kwargs,而是包含所有参数

我认为我想要的很多功能都在 factory_boyStepBuilder 内部被黑盒化了(我怀疑它在 instantiate 中code> 方法),但我不知道如何修改它来做我想做的事。

有没有人想过如何找出在调用 s = SomeFactory() 时最初设置了哪些 kwargs? IE。确定如果我说 s = SomeFactory(name='Matt'),用户手动设置名称?

谢谢!

更新:我正在运行 django 版本 1.11.2factory_boy 版本 2.8.1,以及python 版本 3.5.2

最佳答案

您可以覆盖 create 方法以仅获取用户 kwargs。

一个完整的例子是这样的:

from django.contrib.auth.models import User
import factory


class UserFactory(factory.DjangoModelFactory):
username = factory.Sequence(
lambda n: 'test'
)
email = factory.Sequence(lambda n: 'user{0}@example.com'.format(n))

class Meta:
model = User

@classmethod
def create(cls, **kwargs):

# here you'll only have the kwargs that were entered manually

print(str(kwargs))

return super(UserFactory, cls).create(**kwargs)

所以当我调用它时:

In [2]: UserFactory(username='foobar')
{'username': 'foobar'}
Out[2]: <User: foobar>

如果您想为 create 以外的其他构建策略捕获 kwargs,您还需要为 stubbuild 方法执行此操作.

关于python - factory_boy 提取原始 kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44555506/

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