Lecture de code de faker, une bibliothèque qui génère des données de test en Python

introduction

Pendant ce temps, @TakesxiSximada a publié un article Lecture de code de Safe, une bibliothèque pour vérifier la force des mots de passe en Python, alors je l'ai essayé moi-même. J'ai fait.

J'ai donc pris une bibliothèque appelée faker que je m'intéressais à utiliser depuis un moment.

faker est une bibliothèque qui génère bien des données de test factices. Il s'agit de la version python de celle que vous voyez souvent dans d'autres langues.

https://pypi.python.org/pypi/fake-factory/0.5.3 https://github.com/joke2k/faker

Install Vous pouvez l'installer avec pip.

$ pip install fake-factory

Essayez l'exemple de code README

>>> from faker import Factory

Et ce n'est pas grave si vous générez un générateur qui crée des données de test.

>>> fake = Factory.create()

Après cela, les données de test seront renvoyées comme ceci.

>>> fake.name()
'Anfernee Reichel'
>>> fake.address()
'084 Tiney Fork Suite 757\nPort Earl, MI 20240-1776'
>>> fake.text()
'Facilis non eligendi qui deleniti ullam est. Ab minus est non et occaecati laborum sequi. Vero consectetur repellendus dicta velit. Quisquam omnis alias error sed totam.'

Il prend également en charge le multilinguisme et peut être réalisé en passant locale comme argument à Factory.create ().

>>> fake = Factory.create('ja_JP')
>>> fake.name()
'Yumiko Tsuda'
>>> fake.address()
'32-22-3 Parc Shiba, Chuo-ku, Préfecture de Gunma Kamihiroya Heights 400'
>>> fake.text()
'Non ut in unde ipsa fugiat excepturi voluptate. Enim molestias voluptatem aperiam. Est fuga distinctio sit officia qui velit numquam sint.'

Les données japonaises n'ont pas été préparées pour le texte, donc les données par défaut «en_US» sont renvoyées.

Au fait, «fake» est une instance de «faker.generator.Generator ()».

>>> type(fake)
<class 'faker.generator.Generator'>

Lecture de code

Ensuite, j'aimerais lire le code, Avant cela, il est plus rapide de comprendre qui est le fournisseur en faux, donc je vais d'abord expliquer le fournisseur.

Le fournisseur fournit des données de test

Chaque fournisseur est stocké sous faker / faker / providers.

├── providers
│   ├── __init__.py
│   ├── __pycache__
│   ├── address
│   ├── barcode
│   ├── color
│   ├── company
│   ├── credit_card
│   ├── currency
│   ├── date_time
│   ├── file
│   ├── internet
│   ├── job
│   ├── lorem
│   ├── misc
│   ├── person
│   ├── phone_number
│   ├── profile
│   ├── python
│   ├── ssn
│   └── user_agent

Pour chaque catégorie telle que «adresse» et «code-barres», le répertoire correspondant à chaque langue et le fournisseur qui devient la base de chaque catégorie sont implémentés.

Ici, nous allons nous concentrer sur «personne» et suivre la source. Le subordonné de «personne» ressemble à ceci.

├── providers
│   ├── __init__.py
│   ├── person
│   │   ├── __init__.py
│   │   ├── bg_BG
│   │   ├── cs_CZ
│   │   ├── de_AT
│   │   ├── de_DE
│   │   ├── dk_DK
│   │   ├── el_GR
│   │   ├── en
│   │   ├── en_US
│   │   ├── es_ES
│   │   ├── es_MX
│   │   ├── fa_IR
│   │   ├── fi_FI
│   │   ├── fr_FR
│   │   ├── hi_IN
│   │   ├── hr_HR
│   │   ├── it_IT
│   │   ├── ja_JP
│   │   ├── ko_KR
│   │   ├── lt_LT
│   │   ├── lv_LV
│   │   ├── ne_NP
│   │   ├── nl_NL
│   │   ├── no_NO
│   │   ├── pl_PL
│   │   ├── pt_BR
│   │   ├── pt_PT
│   │   ├── ru_RU
│   │   ├── sl_SI
│   │   ├── sv_SE
│   │   ├── tr_TR
│   │   ├── uk_UA
│   │   ├── zh_CN
│   │   └── zh_TW

Ensuite, regardez __init __. Py directement sous / faker / providers / person. regarder.

from .. import BaseProvider


class Provider(BaseProvider):
    formats = ['{{first_name}} {{last_name}}', ]

    first_names = ['John', 'Jane']

    last_names = ['Doe', ]

    def name(self):
        """
        :example 'John Doe'
        """
        pattern = self.random_element(self.formats)
        return self.generator.parse(pattern)

    @classmethod
    def first_name(cls):
        return cls.random_element(cls.first_names)

    @classmethod
    def last_name(cls):
        return cls.random_element(cls.last_names)
        
    #Omis ci-dessous

De cette manière, le fournisseur qui est la base du fournisseur de personne de chaque langue est implémenté. Il hérite de BaseProvider qui implémente des méthodes de classe qui extraient les données de manière aléatoire telles que random_element (). Tu peux voir ça.

Ensuite, héritez de ce fournisseur et créez de nouvelles propriétés et méthodes, ou remplacez-les pour préparer les fournisseurs correspondant à chaque langue. Veuillez consulter ce qui suit pour le fournisseur de personnes compatible japonais. https://github.com/joke2k/faker/blob/master/faker/providers/person/ja_JP/init.py

Factory.create () --Créer un générateur

https://github.com/joke2k/faker/blob/master/faker/factory.py#L14-L44

Cette méthode crée une instance de <class'faker.generator.Generator '> et la renvoie.

Dans le processus suivant, chaque fournisseur est défini dans faker qui est une instance de <class'faker.generator.Generator '> basé sur locale passé comme argument de Factory.create (). Je vais. (S'il n'y a pas de fournisseur correspondant à la locale spécifiée, celui avec DEFAULT_LOCALE ʻen_US` est défini.)

for prov_name in as:
    if prov_name == 'faker.as':
        continue

    prov_cls, lang_found = cls._get_provider_class(prov_name, locale)
    provider = prov_cls(faker)
    provider.__provider__ = prov_name
    provider.__lang__ = lang_found
    faker.add_provider(provider)

Ensuite, jetons un œil au ʻadd_provider (provider) `qui est sorti dans le processus ci-dessus.

Generator.add_provider () -Ajouter un format au générateur

https://github.com/joke2k/faker/blob/master/faker/generator.py#L22-L39

La méthode publique définie par le fournisseur (ex. <Faker.providers.person.ja_JP.Provider>) passée en argument est ajoutée au format Generator.

Generator.set_formatter () - fonction de wrapper pour setattr ()

https://github.com/joke2k/faker/blob/master/faker/generator.py#L70-L75 Le format de mot est soudainement apparu dans Generator.add_provider (), mais je fais juste setattr () sur l'instance Generator.

Résumé

En faisant Factory.create () comme nous l'avons vu jusqu'ici Vous pouvez obtenir une instance de <class'faker.generator.Generator '> avec toutes les méthodes publiques définies dans le groupe Provider de chaque langue définie dans les attributs. Grâce à cela, juste en appelant fake.method_name () comme indiqué ci-dessous, method_name () implémenté dans le fournisseur de chaque langue est exécuté et des données de test aléatoires peuvent être obtenues. Je suis.

>>> fake.name()
'Anfernee Reichel'

à la fin

Je suis épuisé et je ne suis que la partie Factory.create (), mais si vous comprenez comment générer un générateur, vous saurez comment utiliser cette bibliothèque d'une autre manière. La lecture de code avec une bibliothèque aussi fine est recommandée car elle était facile à attacher et amusante!

Épilogue

Au milieu de la rédaction de cet article "[PersonProvider] de ja_JP (https://github.com/joke2k/faker/blob/master/faker/providers/person/ja_JP/init.py) contient le format dename ()en japonais Comme je le faisais, ʻuser_name () et domain_word () `ne sont pas affichés correctement." J'ai rencontré le problème. https://github.com/joke2k/faker/blob/master/faker/providers/internet/init.py#L27-L32 https://github.com/joke2k/faker/blob/master/faker/providers/internet/init.py#L90-L95

Il a publié un PR pour résoudre le problème ci-dessus et a fusionné en toute sécurité. https://github.com/joke2k/faker/pull/300

Recommended Posts

Lecture de code de faker, une bibliothèque qui génère des données de test en Python
Lecture de code de Safe, une bibliothèque pour examiner la force des mots de passe en Python
Environnement enregistré pour l'analyse des données avec Python
Lecture de code de m3u8, une bibliothèque de manipulation de fichiers m3u8 au format vidéo HLS avec Python
Créez le code qui renvoie "A et prétendant B" en python
Un ensemble de fichiers de script qui font wordcloud avec Python3
[Python] Création d'un outil GUI qui traite automatiquement le CSV des données d'élévation de température dans Excel
Script Python qui stocke 15 ans de données de jeu MLB dans MySQL en 10 minutes (Baseball Hack!)
Une analyse simple des données de Bitcoin fournie par CoinMetrics en Python
Utilisez networkx, une bibliothèque qui gère les graphiques en python (Partie 2: Tutoriel)
À propos de psd-tools, une bibliothèque capable de traiter des fichiers psd en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
Comment créer une grande quantité de données de test dans MySQL? ??
Afficher une liste d'alphabets en Python 3
Générer des données de test japonais avec Python Faker
Présentation d'une bibliothèque qui n'était pas incluse dans pip sur Python / Windows
[Python] J'ai écrit un code simple qui génère automatiquement AA (Ascii Art)
Résumé du livre électronique Python utile pour l'analyse de données gratuite
[Édition DSU] Lecture de la bibliothèque AtCoder avec un codeur vert ~ Implémentation en Python ~
Création de Simple SQLite, une bibliothèque Python qui simplifie la création de table SQLite / l'insertion de données
Créons une base de données clients où le code QR est automatiquement émis en Python
Introduction de "scikit-mobility", une bibliothèque qui vous permet d'analyser facilement les données de flux humain avec Python (Partie 1)
Créez un environnement de test Vim + Python en 1 minute
Dessiner un graphique d'une fonction quadratique en Python
Créez des données de test comme ça avec Python (partie 1)
Un mémo que j'ai écrit un tri rapide en Python
Récupérer l'appelant d'une fonction en Python
J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.
Un programme qui supprime les instructions en double en Python
Copiez la liste en Python
Visualisation en temps réel des données thermographiques AMG8833 en Python
Configurez un serveur SMTP de test en Python.
Réécrire des éléments dans une boucle de listes (Python)
Analyse de données en Python: une note sur line_profiler
Créez un tracé de R semblable à un joyplot avec python
Sortie sous la forme d'un tableau python
Touchons une partie de l'apprentissage automatique avec Python
Opérations de base sur les blocs de données écrites par des débutants au cours d'une semaine d'apprentissage de Python
Un mémo pour générer des variables dynamiques de classe à partir de données de dictionnaire (dict) qui n'ont que des données de type standard en Python3
Résumé des méthodes d'analyse de données statistiques utilisant Python qui peuvent être utilisées en entreprise
Une note sur l'implémentation de la bibliothèque qui explore les hyperparamètres à l'aide de l'optimisation bayésienne en Python
[Python] Un programme qui trouve le nombre d'étapes le plus court dans un jeu qui traverse les nuages
Une note qui implémente une tâche en Python qui charge un fichier GCS dans BigQuery
Code simple qui donne un score de 0,81339 dans Kaggle's Titanic: Machine Learning from Disaster
Programme qui résume les données csv de l’historique des transactions de l’action SBI Securities [Python3]
Créer un bot de collecte de données en Python à l'aide de Selenium
Lecture de données CSV à partir du code Python de stockage d'objets DSX
[Python] Un programme qui compte le nombre de vallées
Résumé des outils nécessaires pour analyser les données en Python
Traitement pleine largeur et demi-largeur des données CSV en Python
Recevez des données de dictionnaire à partir de programmes Python avec AppleScript
Écrivons du code python qui analyse le code go et génère du code go
Un mémorandum lors de l'écriture de code expérimental ~ Se connecter en python
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Ruby, exécution de fragments de code Python de la sélection dans Emacs
Une doublure qui produit 1000000 chiffres de rapport de circonférence avec Python
Une comparaison rapide des bibliothèques de test Python et node.js
Que contient cette variable (lorsque le script Python est en cours d'exécution)