如何在Faker多区域设置模式下为Generator对象使用unique方法
问题:Faker多区域模式下如何使用unique属性?
我希望使用Faker的多区域设置模式,向Faker对象传入区域列表后,调用对应区域的Generator按需生成唯一值。但发现unique属性在Faker对象上可以正常工作,在通过索引获取的Generator对象上却无法使用,运行代码时触发AttributeError: 'Generator' object has no attribute 'unique'。
示例代码:
from faker import Faker fake1 = Faker("en_US") fake2 = Faker(["en_CA", "en_US"]) print(type(fake1)) print(fake1.state()) print(fake1.unique.state()) print(type(fake2["en_US"])) print(fake2["en_US"].state()) print(fake2["en_US"].unique.state())
运行输出:
<class 'faker.proxy.Faker'> Arizona Illinois <class 'faker.generator.Generator'> Oregon Traceback (most recent call last): File "test.py", line 12, in <module> print(fake2["en_US"].unique.state()) AttributeError: 'Generator' object has no attribute 'unique'
解决方案
有两种实用方式可以在多区域模式下实现唯一值生成:
方式1:手动用UniqueProxy包装目标区域的Generator
unique功能是由faker.proxy.UniqueProxy提供的包装能力,直接把指定区域的Generator对象用它包装,就能使用unique属性:
from faker import Faker from faker.proxy import UniqueProxy fake_multi = Faker(["en_CA", "en_US"]) # 为en_US区域的Generator创建UniqueProxy实例 us_fake_unique = UniqueProxy(fake_multi["en_US"]) # 生成唯一的美国州名 print(us_fake_unique.state()) print(us_fake_unique.state())
方式2:为每个区域单独初始化Faker实例
如果不需要共享多区域的Faker对象,直接为每个目标区域创建独立的Faker实例,就能像单区域场景一样正常使用unique:
from faker import Faker # 分别初始化不同区域的Faker对象 fake_us = Faker("en_US") fake_ca = Faker("en_CA") # 生成唯一的美国州名和加拿大省份名 print(fake_us.unique.state()) print(fake_ca.unique.province())
原理说明
unique是Faker代理类(faker.proxy.Faker)的属性,而通过多区域Faker对象索引获取的是底层的Generator对象,本身没有集成UniqueProxy包装。因此要么手动为Generator添加包装,要么使用单区域的Faker实例来获取unique功能。
内容的提问来源于stack exchange,提问作者Peter Roche
相关产品推荐
相关产品推荐

