ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Faker 入门与进阶实战指南:用 Python 生成高质量假数据的完整方案

Faker 入门与进阶实战指南:用 Python 生成高质量假数据的完整方案 Faker 入门与进阶实战指南用 Python 生成高质量假数据的完整方案【免费下载链接】fakerFaker is a Python package that generates fake data for you.项目地址: https://gitcode.com/gh_mirrors/fak/fakerFaker 是 Python 生态中一款生成假数据的工具包本文以官方文档主页docs/index.rst其正文内容通过.. include:: ../README.rst直接嵌入 README.rst为骨架系统讲解 Faker 的安装、基本用法、本地化、命令行动手实践、自定义 Provider、唯一值、随机种子等核心能力并结合仓库源码factory.py、generator.py、proxy.py、cli.py 等深入剖析其内部实现原理。读完本文你将能够独立完成数据库填充、接口测试数据构造、生产数据脱敏、测试用例确定性复现等实战任务。一、Faker 是什么定位与适用场景Faker 是一个用于生成假数据的 Python 包可用于引导bootstrap数据库初始数据生成结构良好的 XML / JSON 等文档填充持久化层数据以进行压力测试对生产服务导出的真实数据进行匿名化处理。Faker 的设计受到了 PHP Faker、Perl Faker 与 Ruby Faker 的启发。它的核心使用哲学是通过faker.Faker()创建并初始化一个生成器对象然后以“数据类型的名字”作为属性/方法来取数据。每次调用都会产生一个不同的随机结果这是因为faker.Generator.method_name()的调用会被转发到faker.Generator.format(method_name)见 generator.py 中format与get_formatter的实现。版本与兼容性自4.0.0起Faker 放弃了对 Python 2 的支持自5.0.0起仅支持 Python 3.8 及以上版本如需 Python 2 兼容可安装3.0.1版本该包旧名为fake-factory2016 年底已弃用依赖解析时请勿再引用旧包名。二、快速开始安装与基本用法使用 pip 安装pip install Faker创建生成器并调用fake.name()、fake.address()、fake.text()等属性from faker import Faker fake Faker() fake.name() # Lucy Cechtelar fake.address() # 426 Jordy Lodge # Cartwrightshire, SC 88120-6700 fake.text() # Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. ...多次调用会得到不同结果for _ in range(10): print(fake.name()) # Adaline Reichel # Dr. Santa Prosacco DVM # Noemy Vandervort V # Lexi OConner # Gracie Weber # Roscoe Johns # Emmett Lebsack # Keegan Thiel # Wellington Koelpin II # Ms. Karley Kiehn V从源码层面看Faker()实际上是一个支持多 locale 的代理类proxy.py。当传入单一 locale 时它会调用Factory.create()factory.py创建一个底层Generator当传入多个 locale 时它会为每个 locale 维护一个子代理并在调用具体方法时通过_select_factory随机挑选一个支持该方法的 factory。三、Provider 机制一切 fake 的载体Faker 将众多生成属性name、address、lorem等称为“fake”它们按“Provider数据提供器”进行打包。内置的 Provider 位于 faker/providers/ 目录下config.py中的PROVIDERS会通过 utils/loading.py 的find_available_providers自动扫描faker.providers包下的全部模块生成列表见 config.py。手动添加内置 Providerfrom faker import Faker from faker.providers import internet fake Faker() fake.add_provider(internet) print(fake.ipv4_private())add_provider的实现位于 generator.py它会把 Provider 实例插入到self.providers列表头部并遍历该 Provider 上所有非_开头的可调用方法通过set_formatter注册为 generator 的方法。因此新添加的 Provider 优先级更高。内置与社区 Provider内置 Provider 列表见 docs/providers/ 目录address、automotive、bank、barcode、color、company、credit_card、currency、date_time、doi、emoji、file、geo、internet、isbn、job、lorem、misc、passport、person、phone_number、profile、python、sbn、ssn、user_agent 等社区 Provider 列表见 docs/communityproviders.rst。四、本地化单 locale、多 locale 与回退机制faker.Faker接受一个 locale 参数以返回本地化数据。若某个 locale 没有对应的本地化 Provider工厂会回退到默认 LCID 字符串en_US定义于 config.py 的DEFAULT_LOCALE。from faker import Faker fake Faker(it_IT) for _ in range(10): print(fake.name()) # Elda Palumbo # Pacifico Giordano # Sig. Avide Guerra # Yago Amato # Eustachio Messina # Dott. Violante Lombardo # Sig. Alighieri Monti # Costanzo Costa # Nazzareno Barbieri # Max Coppola多 locale 支持v3.0.0 起新增from faker import Faker fake Faker([it_IT, en_US, ja_JP]) for _ in range(10): print(fake.name()) # 鈴木 陽一 # Leslie Moreno # Emma Williams # 渡辺 裕美子 # Marcantonio Galuppi # ...多 locale 模式下Faker代理会为每个 locale 创建子实例并在调用方法时从所有支持该方法的 locale 中随机选择一个见 proxy.py 的_select_factory与_map_provider_method。传入的 locale 列表会保持 FIFO 顺序并去重-会被自动规范化为_。locale 的解析与校验在 factory.py 中locale 会依次经过替换-为_、pylocale.normalize()规范化、去小数点后缀最终必须命中AVAILABLE_LOCALES由find_available_locales扫描所有本地化 Provider 汇总得到见 utils/loading.py否则抛出AttributeError。在 factory.py 的_find_provider_class中可以看到本地化回退的完整逻辑对标记了localized的 Provider若指定 locale 不存在则回退到该 Provider 的default_locale或全局DEFAULT_LOCALE对不支持本地化的 Provider指定 locale 会被忽略。Faker 的本地化是一个持续进行的过程社区可以为自己语言的 locale 创建本地化 Provider 并提交 PR。五、性能优化use_weighting 参数Faker构造函数接受一个与性能相关的参数use_weighting默认True。它决定生成值的频率是否贴近真实世界分布例如英文名 Gary 的出现频率应远高于 Lorimer。当设为False时所有元素被选中的概率相等采样过程会快得多。从源码看该参数经 factory.py 传入Generator配置并标记到每个 Provider 实例的__use_weighting__属性上BaseProvider.random_elements 在采样时读取该属性决定是否把OrderedDict的值作为加权概率choices_distribution与choices_distribution_unique定义于 utils/distribution.py。当elements传入普通dict时会抛出ValueError提示改用OrderedDict以避免依赖PYTHONHASHSEED导致的顺序不稳定问题。from faker import Faker fake Faker(use_weightingFalse) # 更快但分布更均匀六、命令行使用faker CLI安装后可直接在命令行调用faker开发环境中也可用python -m fakerfaker [-h] [--version] [-o output] [-l {bg_BG,cs_CZ,...,zh_CN,zh_TW}] [-r REPEAT] [-s SEP] [-i package.containing.custom_provider] [fake] [fake argument [fake argument ...]]参数说明参数含义faker安装到环境中的脚本名开发时可用python -m faker替代-h,--help显示帮助信息--version显示程序版本号-o FILENAME将输出重定向到指定文件-l {bg_BG,...,zh_CN,zh_TW}指定本地化 Provider 的语言-r REPEAT生成指定数量的输出-s SEP每个输出后附加指定分隔符-i package.containing.custom_provider额外自定义 Provider注意传的是包含 Provider 类的包的导入路径而非 Provider 类本身可重复传入以添加多个 Providerfake要生成输出的 fake 名称如name、address、text[fake argument ...]传给 fake 的可选参数如profilefake 的第一个参数是可选的、逗号分隔的字段名列表从 cli.py 的Command.execute可以看到 CLI 的完整实现默认 locale 从系统环境变量LANG读取os.environ.get(LANG, en_US)若不在AVAILABLE_LOCALES中则回退到en_US还额外提供了-v/--verbose显示 INFO 级日志与--seed SEED为随机生成器指定种子以复现结果并与--repeat兼容两个参数。-r模式会先random.seed(arguments.seed)再为每次输出预生成一个子种子。实战示例$ faker address 968 Bahringer Garden Apt. 722 Kristinaland, NJ 09890 $ faker -l de_DE address Samira-Niemeier-Allee 56 94812 Biedenkopf $ faker profile ssn,birthdate {ssn: 628-10-1085, birthdate: 2008-03-29} $ faker -r3 -s; name Willam Kertzmann; Josiah Maggio; Gayla Schmitt; $ faker -i faker_credit_score credit_score_full Experian/Fair Isaac Risk Model V2SM Experian 801另外Faker 内置的文档生成入口python -m faker docs.txt可以为默认 locale 的 Provider 输出使用说明文档python -m faker --langde_DE docs_de.txt则为指定 locale 输出对应 cli.py 的print_doc与main.py 的入口。七、自定义 Provider从零创建一个 fake 方法from faker import Faker fake Faker() # 首先导入一个相似的内置 Provider 或使用默认的 BaseProvider from faker.providers import BaseProvider # 创建新的 provider 类 class MyProvider(BaseProvider): def foo(self) - str: return bar # 然后将新 provider 添加到 faker 实例 fake.add_provider(MyProvider) # 现在就可以使用了 fake.foo() # barBaseProviderfaker/providers/init.py是所有 Provider 的基类内置了大量可复用的随机工具方法例如random_int(min0, max9999, step1)区间随机整数random_digit()/random_digit_not_null()/random_digit_above_two()不同取值范围的随机数字random_number(digitsNone, fix_lenFalse)按位数生成整数random_letter()/random_letters(length16)随机字母random_elements(elements, length, unique, use_weighting)/random_choices/random_element/random_sample带权重与放回/不放回采样的元素选择randomize_nb_elements(number, le, ge, min, max)在给定数值附近随机波动numerify(text)/lexify(text)/bothify(text)/hexify(text)基于占位符#数字、%非零数字、$大于 2 的数字、!数字或空串、非零数字或空串、?字母、^十六进制字符的模板替换locale()/language_code()随机生成 i18n 语言/locale 码。动态 Provider从外部数据源读取元素动态 Provider 可以从外部来源读取元素列表适合元素不固定、需要运行时注入的场景from faker import Faker from faker.providers import DynamicProvider medical_professions_provider DynamicProvider( provider_namemedical_profession, elements[dr., doctor, nurse, surgeon, clerk], ) fake Faker() # 然后将新 provider 添加到 faker 实例 fake.add_provider(medical_professions_provider) # 现在就可以使用了 fake.medical_profession() # dr.DynamicProvider的实现在 faker/providers/init.pyprovider_name会作为方法名动态绑定到实例上elements作为随机采样的元素池并可通过add_element()在运行时追加元素。注意provider_name不能以__开头否则会被add_provider跳过而无法使用且elements为空时调用会抛出ValueError。定制 Lorem Provider如果不希望使用默认的 lorem ipsum 词表可以传入自己的词表from faker import Faker fake Faker() my_word_list [ danish,cheesecake,sugar, Lollipop,wafer,Gummies, sesame,Jelly,beans, pie,bar,Ice,oat, ] fake.sentence() # Expedita at beatae voluptatibus nulla omnis. fake.sentence(ext_word_listmy_word_list) # Oat beans oat Lollipop bar cheesecake.八、与其他框架集成Factory BoyFactory Boy 已内置对 Faker 的集成直接使用factory.Faker即可import factory from myapp.models import Book class BookFactory(factory.Factory): class Meta: model Book title factory.Faker(sentence, nb_words4) author_name factory.Faker(name)Pytest fixturesFaker 自带 pytest 插件faker/contrib/pytest/plugin.py提供fakerfixture可直接在测试中注入def test_faker(faker): assert isinstance(faker.name(), str)关于faker_session_locale、faker_seed、faker_locale等 fixture 的完整配置方法请阅读 pytest-fixtures.rst默认fakerfixture 是session 级Faker实例locale 默认en_US并在每个测试前用种子0重新播种、清空.unique的记忆值在顶层conftest.py定义 session 级 autouse 的faker_session_locale/faker_seed可改变全局默认 locale 与种子在子模块conftest.py或测试文件中定义非 session 级 autouse 的faker_locale/faker_seed可让特定测试获得新的函数级实例或使用不同种子即使测试中途手动调用seed_instance也不会影响其他测试fixture 有播种保证。上述行为的源码依据见 plugin.py_session_faker按需读取faker_session_localefakerfixture 按faker_locale是否存在决定返回新实例还是 session 实例随后固定执行fake.seed_instance(seedDEFAULT_SEED)DEFAULT_SEED 0与fake.unique.clear()。九、访问底层 random 实例生成器的.random属性返回用于生成值的random.Random实例from faker import Faker fake Faker() fake.random fake.random.getstate()默认情况下所有生成器共享同一个random.Random实例可通过from faker.generator import random访问见 generator.py 的模块级random对象。这对手动替换random如fake.random random.Random(42)以影响所有 faker 实例的场景很有用。需要说明的是在多 locale 模式下random的 getter/setter 代理未实现proxy.py 会抛出NotImplementedError。十、唯一值.unique 属性通过生成器的.unique属性可以保证对当前实例生成的任何值都是唯一的from faker import Faker fake Faker() names [fake.unique.first_name() for i in range(500)] assert len(set(names)) len(names)多 locale 实例上可以用下标语法指定 locale 的唯一值from faker import Faker fake Faker([en_US, fr_FR]) names [fake.unique[en_US].first_name() for i in range(500)] assert len(set(names)) len(names)调用fake.unique.clear()会清空已见过的值集合。注意事项源码依据见 proxy.py 的UniqueProxy为避免无限循环连续尝试_UNIQUE_ATTEMPTS1000次仍未找到唯一值后会抛出UniquenessException定义于 exceptions.py。请留意“生日悖论”——碰撞概率远比直觉上高from faker import Faker fake Faker() for i in range(3): # Raises a UniquenessException fake.unique.boolean().unique只支持可哈希的参数与返回值UniqueProxy._make_hashable会把 dict/list/set 递归转换为可哈希表示fake.unique.exclude_types([bool])可以返回一个对指定类型不做唯一性检查的新代理如proxy.pybool()允许重复而proxy.name()仍强制唯一。十一、随机种子可复现的测试数据做单元测试时通常希望每次生成相同的数据集。生成器提供seed()方法用于给共享的随机数生成器播种。在相同版本、相同方法与相同种子的前提下会产出相同结果from faker import Faker fake Faker() Faker.seed(4321) print(fake.name()) # Margaret Boehm每个生成器也可以通过seed_instance()切换到自己的、与共享随机源隔离的random.Random实例行为一致from faker import Faker fake Faker() fake.seed_instance(4321) print(fake.name()) # Margaret Boehmseed_instance()的实现在 generator.py首次调用时若当前仍指向共享random会创建新的random.Random()实例并播种Generator.seed()类方法则直接对模块级共享random播种。Faker.seed()是类方法proxy.py在实例上调用.seed()会收到弃用提示并要求改用类方法。seed_locale(locale, seed)还可单独对某个 locale 的 factory 播种。注意随着数据集持续更新跨 patch 版本的结果不保证一致。如果测试中硬编码了生成结果务必把 Faker 版本锁定到 patch 号。使用 pytest 时也可通过定义faker_seedfixture 为fakerfixture 播种见前文。十二、运行测试与生成文档运行测试$ tox为默认 locale 的 Provider 生成使用文档$ python -m faker docs.txt为指定 locale 的 Provider 生成文档$ python -m faker --langde_DE docs_de.txt十三、文档导航从这里继续深入README.rst被 docs/index.rst 作为文档主页嵌入按以下结构组织全部文档内容可继续深入阅读fakerclass.rstFaker/Generator类参考providers/内置 Provider 参考communityproviders.rst社区 Provider 清单locales/本地化支持情况pytest-fixtures.rstpytest 插件与 fixture 详解coding_style.rst 与 writing-docs.rst为 Faker 贡献 Provider 时的编码风格与文档规范。Faker 遵循 MIT 许可证见 LICENSE.txt贡献指南见 CONTRIBUTING.rst。总结本文完整覆盖了 Faker 的核心使用链路从安装与基础生成、Provider 机制与本地化到use_weighting性能调优、CLI 实战、自定义/动态 Provider、Factory Boy 与 pytest 集成、底层random访问、唯一值保证、种子复现再到源码层的实现验证。读者可以此为基础直接在自己的项目里落地数据库填充、测试数据构造与数据脱敏等实践并借助Faker.seed()/seed_instance()构建确定性的测试环境。【免费下载链接】fakerFaker is a Python package that generates fake data for you.项目地址: https://gitcode.com/gh_mirrors/fak/faker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表