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
>>> 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'>
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.
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
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.
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.
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.
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'
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!
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