Während dieser Zeit veröffentlichte @TakesxiSximada einen Artikel Code lesen von Safe, einer Bibliothek zum Überprüfen der Kennwortstärke in Python, also habe ich es selbst versucht. Ich tat.
Also nahm ich eine Bibliothek namens faker, die ich schon seit einiger Zeit nutzen wollte.
faker ist eine Bibliothek, die Dummy-Testdaten gut generiert. Dies ist die Python-Version derjenigen, die Sie häufig in anderen Sprachen sehen.
https://pypi.python.org/pypi/fake-factory/0.5.3 https://github.com/joke2k/faker
Install Sie können es mit pip installieren.
$ pip install fake-factory
>>> from faker import Factory
Und es ist in Ordnung, wenn Sie einen Generator generieren, der Testdaten erstellt.
>>> fake = Factory.create()
Danach werden die Testdaten wie folgt zurückgegeben.
>>> 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.'
Es unterstützt auch die Mehrsprachigkeit und kann realisiert werden, indem "locale" als Argument an "Factory.create ()" übergeben wird.
>>> fake = Factory.create('ja_JP')
>>> fake.name()
'Yumiko Tsuda'
>>> fake.address()
'32-22-3 Shiba Park, Chuo-ku, Präfektur 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.'
Japanische Daten wurden nicht für Text vorbereitet, daher werden die Standarddaten "en_US" zurückgegeben.
"Fake" ist übrigens eine Instanz von "faker.generator.Generator ()".
>>> type(fake)
<class 'faker.generator.Generator'>
Dann möchte ich den Code lesen, Vorher ist es schneller zu verstehen, wer der Provider ist, also werde ich den Provider zuerst erklären.
Jeder Anbieter wird unter faker / faker / provider gespeichert.
├── 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
Für jede Kategorie wie "Adresse" und "Barcode" werden ein Verzeichnis implementiert, das jeder Sprache entspricht, und ein Anbieter, der die Basis jeder Kategorie bildet.
Hier konzentrieren wir uns auf "Person" und folgen der Quelle. Der Untergebene von "Person" sieht so aus.
├── 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
Schauen Sie sich als Nächstes __init __. Py
direkt unter / faker / provider / person
an. schauen.
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)
#Unten weggelassen
Auf diese Weise wird der Anbieter implementiert, der die Basis des Personenanbieters jeder Sprache bildet.
Es erbt BaseProvider, das Klassenmethoden implementiert, die Daten zufällig extrahieren, wie z. B. random_element ()
. Sie können sehen, dass.
Erben Sie dann diesen Anbieter und erstellen Sie neue Eigenschaften und Methoden oder überschreiben Sie diese, um Anbieter vorzubereiten, die jeder Sprache entsprechen. Informationen zum japanisch kompatiblen Personenanbieter finden Sie im Folgenden. 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
Diese Methode erstellt eine Instanz von "<class'faker.generator.Generator"> und gibt sie zurück.
Im folgenden Prozess wird jeder Provider in "faker" gesetzt, einer Instanz von "<class'faker.generator.Generator"> "basierend auf" locale ", die als Argument von" Factory.create () "übergeben wurde. Ich werde. (Wenn es keinen Anbieter gibt, der dem angegebenen "Gebietsschema" entspricht, wird der mit DEFAULT_LOCALE "en_US" festgelegt.)
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)
Schauen wir uns als nächstes den "add_provider (provider)" an, der im obigen Prozess herausgekommen ist.
https://github.com/joke2k/faker/blob/master/faker/generator.py#L22-L39
Die vom Provider definierte öffentliche Methode (z. B. <Faker.providers.person.ja_JP.Provider>), die als Argument übergeben wurde, wird dem Generatorformat hinzugefügt.
https://github.com/joke2k/faker/blob/master/faker/generator.py#L70-L75 Das Wortformat erschien plötzlich bei "Generator.add_provider ()", aber ich mache nur setattr () für die Generator-Instanz.
Mit Factory.create ()
, wie wir bisher gesehen haben
Sie können eine Instanz von "<class'faker.generator.Generator"> mit allen öffentlichen Methoden abrufen, die in der Provider-Gruppe jeder in Attributen festgelegten Sprache definiert sind.
Dank dessen wird einfach durch Aufrufen von "fake.method_name ()" wie unten gezeigt "method_name ()" ausgeführt, das im Provider jeder Sprache implementiert ist, und es können zufällige Testdaten abgerufen werden. Ich bin.
>>> fake.name()
'Anfernee Reichel'
Ich bin erschöpft und folge nur dem Teil Factory.create ()
, aber wenn Sie verstehen, wie man einen Generator generiert, wissen Sie, wie Sie diese Bibliothek auf andere Weise verwenden können.
Das Lesen von Code mit einer so dünnen Bibliothek wird empfohlen, da es einfach anzuhängen war und Spaß machte!
Während des Schreibens dieses Artikels "[PersonProvider] von" ja_JP "(https://github.com/joke2k/faker/blob/master/faker/providers/person/ja_JP/init.py) enthält das japanische Format" name () " Aus diesem Grund werden "Benutzername ()" und "Domänenwort ()" nicht richtig angezeigt. " Ich bin auf das Problem gestoßen. 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
Er gab eine PR heraus, um das oben genannte Problem zu lösen, und fusionierte sicher. https://github.com/joke2k/faker/pull/300