使用factory.LazyAttribute生成关联姓名的假邮箱输出异常如何修复
问题修复方案
根因说明
factory.LazyAttribute是factory_boy库专为工厂类字段设计的延迟计算对象,仅在工厂类实例化时才会触发计算逻辑,直接写入普通字典时只会返回对象本身,无法得到预期的字符串结果。你的场景下无需引入该特性,直接在循环内预存生成的姓名变量,直接拼接邮箱即可。
修复后代码(轻量实现,无需依赖factory_boy)
import numpy as np from faker import Faker fake = Faker() def faker_categorical(num=1, seed=None): np.random.seed(seed) fake.seed_instance(seed) output = [] for x in range(num): gender = np.random.choice(["M", "F"], p=[0.5, 0.5]) # 预存生成的姓名变量,方便后续拼接邮箱 first_name = fake.first_name() last_name = fake.last_name() output.append( { "First name": first_name, "Last name": last_name, # 直接拼接生成邮箱,全小写符合常规邮箱命名习惯 "E-mail": f"{first_name.lower()}.{last_name.lower()}@example.com", }) return output
可选实现(保留factory_boy LazyAttribute特性)
如果你的项目本身依赖factory_boy,也可以通过定义字典工厂类的方式实现,代码如下:
import factory import numpy as np from faker import Faker fake = Faker() # 定义用户字典工厂类 class UserFactory(factory.DictFactory): first_name = factory.LazyAttribute(lambda _: fake.first_name()) last_name = factory.LazyAttribute(lambda _: fake.last_name()) "E-mail" = factory.LazyAttribute(lambda obj: f"{obj.first_name.lower()}.{obj.last_name.lower()}@example.com") def faker_categorical(num=1, seed=None): np.random.seed(seed) fake.seed_instance(seed) output = [] for x in range(num): gender = np.random.choice(["M", "F"], p=[0.5, 0.5]) user = UserFactory() user["gender"] = gender output.append(user) return output
内容的提问来源于stack exchange,提问作者Nanda
相关产品推荐
相关产品推荐

