Framework-Entwicklung mit Python

Agenda

  1. Selbsteinführung
  2. Hintergrund
  3. Was steht in diesem Artikel?
  4. Denken Sie an die Zusammenfassung
  5. Rahmenentwicklung
  6. Zusammenfassung

Vorstellen

Hallo, mein Name ist Furuuchi und ich bin CTO / Server Side Engineer bei Anyflow Co., Ltd.. Meine übliche Sprache ist Python und ich arbeite auch mit dem Django-Framework. Django schreibt den folgenden Code. https://github.com/furuuchitakahiro/django_othello Anyflow arbeitet im Bereich iPaaS. iPaaS ist eine Abkürzung für Integration Platform as a Service und insbesondere eine Plattform für die Integration zwischen SaaS, z. B. die Integration von Slack und Tabellenkalkulationen.

Hintergrund

Bei Anyflow besteht die Hauptaufgabe der serverseitigen Ingenieure darin, verschiedene SaaS zu integrieren. Implementieren Sie beispielsweise Code, der eine Nachricht in Slack sendet oder einen Wert aus einer Tabelle liest. Slack und Tabellenkalkulationen werden jedoch auf völlig unterschiedlichen Systemen ausgeführt, und Sie müssen den Koordinierungscode für jedes SaaS implementieren. Wenn Sie tiefer gehen, können Sie in Slack Nachrichten senden, Dateien senden, Benutzerinformationen abrufen usw. In einem SaaS gibt es viele Implementierungen. Wenn es darum geht, all dies zu verknüpfen, ist es nicht sehr gut, aber mit Oreore Script gibt es kein Warten auf den Todesmarsch. Um dieses Problem zu lösen, hat Anyflow ein SaaS-Integrationsframework entwickelt. Ich werde zusammenfassen, woran ich gearbeitet habe.

Was steht in diesem Artikel geschrieben

** Ich versuche, den Inhalt als Referenz für die Verbesserung der Montagefähigkeit zu verwenden. ** ** **

In diesem Artikel demonstrieren wir die Implementierung der Ententypisierung, während das Abstrakte und Konkrete erfasst wird. Die Inhalte werden in der Reihenfolge erklärt, in der mit einfachen und leicht verständlichen Inhalten begonnen und diese schrittweise anhand von Beispielen angewendet werden. Selbst wenn Sie kein Framework entwickeln, können Sie ein wenig Verständnis für das Framework wie Django erlangen, das Sie normalerweise verwenden.

Denken Sie abstrakt

Haben Sie jemals plötzlich an ** "abstrakt" ** gearbeitet oder darüber nachgedacht? Ich habe nicht zu viel nachgedacht, bevor ich Anyflow erstellt habe.

Zunächst werde ich ** menschlich ** als Thema auf leicht verständliche Weise erklären. "Taro Tanaka ist ein Mensch." Wenn Sie dies als abstrakt und konkret betrachten "** Taro Tanaka [Spezifisch] ** ist ** Mensch [Zusammenfassung] **." Wird sein. Dieses Level ist einfach, nicht wahr? Lassen Sie es uns übrigens in Python konvertieren.

class Human:
    def __init__(self, name: str):
        self.name = name


if __name__ == '__main__':
    taro = Human(name='Taro Tanaka')
    print(taro.name)
    # > 'Taro Tanaka'

Es ist wirklich einfach. Dies allein offenbart nicht die Vorteile der Abstraktion, daher werden wir uns damit befassen. Wenn Sie ein Mensch sind, haben Sie zusätzlich zu Ihrem Namen das Alter, können auch als Begrüßung fungieren und haben eine Familie. Basierend auf diesen werden wir es wieder in Python konvertieren.

from typing import Iterable, List


class Human:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def greeting(self) -> str:
        return f'ich{self.name}Mein Name ist. Alter ist{self.age}Ich bin alt.'


class Family:
    def __init__(self, members: Iterable[Human]):
        self.members = list(members)

    def all_greeting(self) -> List[str]:
        return [member.greeting() for member in self.members]


if __name__ == '__main__':
    taro = Human(name='Ichiro Tanaka', age=20)
    jiro = Human(name='Jiro Tanaka', age=19)
    saburo = Human(name='Saburo Tanaka', age=18)
    tanaka_family = Family(members=[taro, jiro, saburo])
    print(tanaka_family.all_greeting())
    # > [
    #     'Ich heiße Ichiro Tanaka. Ich bin 20 Jahre alt.',
    #     'Ich heiße Jiro Tanaka. Ich bin 19 Jahre alt.',
    #     'Ich heiße Saburo Tanaka. Ich bin 18 Jahre alt.'
    # ]

Plötzlich wurde der Code länger. Der zu betrachtende Punkt ist die Klasse ** Familie **. Die Family-Klasse verwendet in ihrem Konstruktor eine Reihe von Instanzen der Human-Klasse. Die Logik, mit der die all_greeting-Methode arbeitet, setzt voraus, dass Mitglieder eine Instanz der menschlichen Klasse in der Liste sind. Unter einem anderen Gesichtspunkt können ** Mitglieder als in Ordnung angesehen werden, wenn nur die Bedingung ** erfüllt ist, bei der es sich um ein Array von Instanzen der menschlichen Klasse handelt. (Sogenannte Generika) Dies ist das Ergebnis der Kombination der menschlichen Klasse, die das abstrakte Konzept der Menschheit ist, und der Familienklasse, die das abstrakte Konzept der Familie ist, die eine Gruppe von Menschen ist. Extreme Geschichte Diese Implementierung ist ** jeder Name und jedes Alter für Menschen, und selbst wenn es 100 gibt, wird sie als Familie fungieren, wenn es menschlich ist **. Ich habe keine Besonderheiten angesprochen, sondern mich auf menschliche und familiäre Merkmale konzentriert.

Es ist klar geworden, dass abstrakt die Definition des gemeinsamen Nenners der Dinge ist.

image1.png

Framework-Entwicklung

Dies ist der wichtige Punkt bei der Entwicklung des Frameworks. Was ich erkläre, ist das sogenannte ** Ententippen **. Auf Wikipedia ** [Wenn es wie eine Ente läuft und wie eine Ente klingt, muss es eine Ente sein](https://ja.wikipedia.org/wiki/%E3%83%80%E3% 83% 83% E3% 82% AF% E3% 83% BB% E3% 82% BF% E3% 82% A4% E3% 83% 94% E3% 83% B3% E3% 82% B0) ** Es ist gewesen.

Dieser Kommentar erstellt die folgenden Funktionen basierend auf etwas wie ** FaceBook **, das sich auf Ihre Heimatstadt konzentriert.

Das Konzept ist ** ein FaceBook ** - ähnlicher Typ mit einem Profil dessen, was er von der Spezialität seiner Heimatstadt hält. Wir werden dies ** "Hometown FB" ** zur Erklärung nennen. Jetzt machen wir es Python-Code. Die Konfiguration ist wie folgt.

--main.py (Hauptverarbeitung) --mods (Modulverzeichnis) --human.py --questions.py --prefectures.py (Präfekturen)

Implementieren Sie zunächst die Fragen in question.py.

from typing import ClassVar


class BaseQuestion:
    QUEASTION: ClassVar[str] = ''

    def __init__(self, answer: str):
        self.answer = answer

    @property
    def to_qa(self) -> str:
        return f'Q. {self.__class__.QUEASTION}\nA. {self.answer}'


class SeaQuestion(BaseQuestion):
    QUEASTION: ClassVar[str] = 'Ist das Meer Ihrer Heimatstadt wunderschön?'


class FujisanQuestion(BaseQuestion):
    QUEASTION: ClassVar[str] = 'Ist der Fuji schön?'

BaseQuestion definiert Fragwürdigkeit. Fragenähnlichkeit bedeutet, das Konzept und die Antwort eines Fragensatzes zu haben. SeaQuestion und FujisanQuestion definieren spezifische Fragen für diese BaseQuestion. Wichtig ist hier, dass wir die Antwort noch nicht angesprochen haben. ** Eine Frage wird als Fragensatz und Antwortsatz betrachtet. Darüber hinaus gibt es einen konkreten und standardmäßigen Fragensatz und mehrere Antwortsätze **. Der Punkt ist, dass Sie, wenn Sie von BaseQuestion erben, alle gleich wie Fragen behandeln können. Alle Fragen haben eine Funktion, mit der Sie den Fragentext ausspucken und den Text zusammen als Zeichenfolge beantworten können. (to_qa Methode) Mit anderen Worten, die BaseQuestion-Klasse fungiert als Fragenrahmen. Es wird die Aufgabe der FB der Heimatstadt sein, BaseQuestion zu erben und viele Fragen zu stellen.

Implementieren Sie dann den Status in prefectures.py.

from typing import ClassVar, Tuple, Iterable
from . import questions


class BasePrefecture:
    NAME: ClassVar[str] = ''
    QUESTIONS: ClassVar[Tuple[questions.BaseQuestion, ...]] = tuple()

    def __init__(self, qa_list: Iterable[questions.BaseQuestion]):
        self.qa_list = list(qa_list)

    @classmethod
    def get_questions(cls) -> Tuple[str, ...]:
        return tuple(question.QUEASTION for question in cls.QUESTIONS)


class Tokyo(BasePrefecture):
    NAME: ClassVar[str] = 'Tokio'
    QUESTIONS: ClassVar[Tuple[questions.BaseQuestion, ...]] = (
        questions.SeaQuestion
    )


class Sizuoka(BasePrefecture):
    NAME: ClassVar[str] = 'Shizuoka'
    QUESTIONS: ClassVar[Tuple[questions.BaseQuestion, ...]] = (
        questions.SeaQuestion,
        questions.FujisanQuestion
    )


class Yamanashi(BasePrefecture):
    NAME: ClassVar[str] = 'Yamanashi'
    QUESTIONS: ClassVar[Tuple[questions.BaseQuestion, ...]] = (
        questions.FujisanQuestion
    )

Dies ist die gleiche Struktur wie die Frage. Die BasePrefecture-Klasse definiert nur, dass der Status einen Namen und eine Frage hat. Erben Sie die definierte BasePrefecture-Klasse und definieren Sie die Tokyo-Klasse usw. Stellen Sie zu diesem Zeitpunkt die Tokio-Klasse ein (Name und Fragenliste). Der spezifischste Zustand ist der Zustand, in dem Sie einen Herkunftsort und eine Reihe von Fragen und Antworten haben. Die BasePrefecture-Klasse fungiert als Präfektur-Framework.

Schließlich ist human.py eine menschliche Implementierung.

from . import prefectures


class Human:
    def __init__(
        self, name: str, age: int, prefecture: prefectures.BasePrefecture
    ):
        self.name = name
        self.age = age
        self.prefecture = prefecture

    def greeting(self) -> str:
        qa_list_str = '\n'.join([qa.to_qa for qa in self.prefecture.qa_list])
        return (
            f'ich{self.name}Mein Name ist. Alter ist{self.age}Ich bin alt.'
            '\nQ&A'
            f'\n{qa_list_str}'
        )

Die menschliche Klasse ist fast dieselbe. Es hat sich nicht viel geändert von [Über abstrakt nachdenken](# Über abstrakt nachdenken). Als zusätzlichen Punkt wird dem Konstruktor die Präfektur hinzugefügt, und der Frage und Antwort für diese Präfektur wird nur eine Begrüßung (Selbsteinführung) hinzugefügt.

Klicken Sie hier, um die main.py-Implementierung der Verwendung anzuzeigen

from mods import questions, prefectures
from mods.human import Human


if __name__ == '__main__':
    tokyo = prefectures.Tokyo(qa_list=[
        questions.SeaQuestion(answer='Es ist ein bisschen schmutzig.')
    ])
    taro = Human(name='Taro Tanaka', age=20, prefecture=tokyo)
    print(taro.greeting())
    # >Ich heiße Taro Tanaka. Ich bin 20 Jahre alt.
    # Q&A
    # Q.Ist das Meer Ihrer Heimatstadt wunderschön?
    # A.Es ist ein bisschen schmutzig.

    shizuoka = prefectures.Sizuoka(qa_list=[
        questions.SeaQuestion(answer='Ist schön.'),
        questions.FujisanQuestion(answer='es ist groß.')
    ])
    jiro = Human(name='Jiro Tanaka', age=22, prefecture=shizuoka)
    print(jiro.greeting())
    # >Ich heiße Jiro Tanaka. Ich bin 22 Jahre alt.
    # Q&A
    # Q.Ist das Meer Ihrer Heimatstadt wunderschön?
    # A.Ist schön.
    # Q.Ist der Fuji schön?
    # A.es ist groß.

    yamanashi = prefectures.Yamanashi(qa_list=[
        questions.FujisanQuestion(answer='es ist groß.')
    ])
    saburo = Human(name='Saburo Tanaka', age=24, prefecture=yamanashi)
    print(saburo.greeting())
    # >Ich heiße Saburo Tanaka. Ich bin 24 Jahre alt.
    # Q&A
    # Q.Ist der Fuji schön?
    # A.es ist groß.

Zusammenfassung der Implementierung

Es mag zu minimal sein, um wie ein Framework auszusehen, aber ich denke, es berührt das Wesentliche. Das Schöne an der Eingabe von Enten ist, dass der Code leicht zu sehen ist. Durch die richtige Trennung des Verantwortungskörpers (Abstraktionsgrad) der Klasse kann das zu lösende Problem klar ausgedrückt und die Skalierbarkeit (Diversität) beibehalten werden.

Es gibt nur drei Basiscodes für diese Heimatstadt-FB: BaseQuestion-, BasePrefecture- und Human-Klassen. Im Laufe der Zeit wird der FB-Dienst in der Heimatstadt durch das Erben von BaseQuestion und BasePrefecture erweitert.

image2.png

Wenn Sie Webentwicklung betreiben, erstellen Sie wahrscheinlich XX Modelle mit dem Framework. Natürlich erben und deklarieren Sie zu diesem Zeitpunkt die Modellklasse des Frameworks, oder? Die Modellklasse des Frameworks definiert nur das Verhalten beim Lesen, Erstellen, Aktualisieren und Löschen und erwähnt nichts über Spalten. Ich denke, dass Spalten in der von Ihnen erstellten XX-Modellklasse definiert sind. Die Beziehung zwischen der Modellklasse des Frameworks und dem von Ihnen definierten XX-Modell ist die der Ententypisierung.

Diese Demonstration war ein geschäftsspezifischer Rahmen. Die Implementierung einer abstrakteren Sache (Model View Controller) gemäß dem Inhalt dieses Artikels macht es zu einem universellen Framework für die Entwicklung von Webanwendungen.

Zusammenfassung

Eigentlich hat Python eine Menge Inhalt zu erzählen, wenn mehr Frameworks wie ABC, Dokumentationszeichenfolge für Dokumentation, Typhinweise und DI entwickelt werden, aber da es sich um eine Satzmenge handelt, die ein Buch schreiben kann. Dieses Mal habe ich eine Demonstration gemacht, die hauptsächlich Abstraktion und Konkretheit berücksichtigt und sie in die ausgegrabene Typisierung einbezieht.

** Anyflow ist 10.000-mal intensiver als der Inhalt dieses Artikels! ** ** ** ** Ich habe viel zu besprechen, wie zum Beispiel Entwicklungsgeschichte und Airflow! ** ** ** ** Wenn Sie Logik und Design mögen oder daran interessiert sind, lassen Sie es uns bitte wissen! ** ** ** ** Für diejenigen, die daran interessiert sind, Services sowie Engineering bei Startups zu starten! ** ** **

Anyflow hat viel Schwung! Ich habe das B Dash Camp gewonnen! https://jp.techcrunch.com/2019/10/31/b-dash-camp-2019-fall-pitch-arena/ Ich habe das Inkubationslager gewonnen! https://jp.techcrunch.com/2019/09/14/incubate-camp-12th/

Rekrutierungsseite: https://open.talentio.com/1/c/anyflow/requisitions/detail/13828 Wenn Sie lockerer sind, wenden Sie sich bitte an https://www.facebook.com/takahiro.furuuchi.37!

Recommended Posts

Framework-Entwicklung mit Python
Entwicklungsumgebung in Python
Slackbot-Entwicklung in Python
Python-Entwicklung mit Visual Studio 2017
Python-Entwicklung mit Visual Studio
Quadtree in Python --2
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Zwietracht in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Tastenanschlag in Python
Verwenden Sie config.ini mit Python
Täglicher AtCoder # 33 in Python