recherche
Maisondéveloppement back-endTutoriel PythonL'impact de la saisie en Python

O impacto da tipagem no python

Python version 3.5 introduit des « indices de type » pour rendre le code plus lisible et permettre aux développeurs de mieux comprendre le code de chacun.

Pourquoi les indices de type sont-ils importants ?

Dans les langages fortement typés comme Java et C, l'inversion de dépendances (DI - Dependency Inversion) est une technologie importante, mais elle est difficile à implémenter dans les langages faiblement typés.

L'idée centrale de l'inversion des dépendances est la suivante : les classes ne doivent pas s'appuyer sur des implémentations spécifiques, mais sur des abstractions. Car les abstractions (interfaces ou classes abstraites) sont des contrats relativement stables.

Mauvais exemple :

class GasStation:
    def fill_tank(car, amount):
        car.fill(amount)

Dans cet exemple, la station-service ne peut ravitailler que les voitures. Pour aggraver les choses, puisque la fonction fill_tank n'a pas de type défini, n'importe quelle valeur peut être transmise et l'erreur ne sera découverte qu'au moment de l'exécution.

Bon exemple :

from typing import Protocol

class Vehicle(Protocol):
    def fill(amount: int) -> None:
        ...
class GasStation:
    def fill_tank(vehicle: Vehicle, amount: int) -> None:
        vehicle.fill(amount)

Dans cet exemple, définissez d'abord la classe abstraite Vehicle (en utilisant typing.Protocol). La fonction GasStation de fill_tank ne s'appuie plus sur une classe de voiture spécifique, mais sur l'interface Vehicle, devenant ainsi plus générale et pouvant faire le plein de tout véhicule mettant en œuvre la méthode fill.

Qu'est-ce que PyDIT ?

J'ai profité du système d'indication de types de Python et créé une bibliothèque qui simplifie l'utilisation de l'inversion de dépendances, appelée PyDIT (Python Dependency Injection with Types).

Supposons que vous ayez besoin d'une interface de base de données pour stocker les données utilisateur. Que vous utilisiez PostgreSQL, MySQL, OracleDB, une base de données en mémoire ou une base de données NoSQL, vous devez implémenter une classe de connexion à la base de données et fournir les fonctions de lecture, d'écriture et de suppression d'enregistrements. .

from time import sleep
from typing import TypedDict
from typing_extensions import override
from uuid import UUID
from src.configs.di import pydit
from src.adapters.repositories.interfaces.user import UserRepository
from src.constants.injection import MEMORY_REPOSITORY_CONFIG_TOKEN
from src.domain.user.models.user import UserModel


class ConfigType(TypedDict):
    delay: int


class MemoryUserRepository(UserRepository):

    __users: dict[UUID, UserModel] = {}

    def __init__(self):
        self.__delay = self.config.get("delay", 0.2)

    @pydit.inject(token=MEMORY_REPOSITORY_CONFIG_TOKEN)
    def config(self) -> ConfigType:  # TODO: supress return type error
        pass

    @override
    def get_by_id(self, *, id_: UUID) -> UserModel:
        sleep(self.__delay)

        user = self.__users.get(id_)

        if user is None:
            raise ValueError("User not found")

        return user

    @override
    def save(self, *, data: UserModel) -> None:
        sleep(self.__delay)
        self._check_pk_conflict(pk=data.id)

        self.__users[data.id] = data

    @override
    def list_(self) -> list[UserModel]:
        return list(self.__users.values())

    def _check_pk_conflict(self, *, pk: UUID) -> None:
        if pk not in self.__users:
            return

        raise ValueError("Primary key conflicts: DB alrady has a user with this ID")

Afin de garantir que le code n'a rien à voir avec la technologie des bases de données, définissez une interface que toutes les classes de bases de données doivent suivre :

from abc import abstractmethod
from typing import Protocol
from uuid import UUID
from src.domain.user.models.user import UserModel


class UserRepository(Protocol):
    @abstractmethod
    def get_by_id(self, *, id_: UUID) -> UserModel:
        pass

    @abstractmethod
    def save(self, *, data: UserModel) -> None:
        pass

    @abstractmethod
    def list_(self) -> list[UserModel]:
        pass

Ensuite, initialisez les dépendances pour l'injection :

from src.adapters.repositories.in_memory.user import MemoryUserRepository
from src.constants.injection import MEMORY_REPOSITORY_CONFIG_TOKEN
from .di import pydit
from .get_db_config import get_db_config


def setup_dependencies():
    pydit.add_dependency(get_db_config, token=MEMORY_REPOSITORY_CONFIG_TOKEN)
    pydit.add_dependency(MemoryUserRepository, "UserRepository")

Enfin, injectez les dépendances dans le module qui crée l'utilisateur :

from typing import cast
from src.adapters.repositories.interfaces.user import UserRepository
from src.configs.di import pydit
from src.domain.user.models.create_user import CreateUserModel
from src.domain.user.models.user import UserModel
from src.domain.user.services.create import CreateUserService
from src.domain.user.services.list import ListUsersService


class UserModule:
    @pydit.inject()
    def user_repository(self) -> UserRepository:
        return cast(UserRepository, None)

    def create(self, data: CreateUserModel) -> None:
        CreateUserService(self.user_repository).execute(data)

    def list_(self) -> list[UserModel]:
        return ListUsersService().execute()

Les dépendances sont injectées en tant que propriétés et sont accessibles via self ou module.user_repository .

Cet exemple est simple, mais PyDIT peut être appliqué à une variété de configurations de projet, d'abstractions de code et de scénarios de principe SOLID. Bienvenue pour essayer de contribuer au code !

Référentiel de code : Github
LinkedIn : Marcelo Almeida (MrM4rc)
PyPI : python-pydit

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Comment les tableaux sont-ils utilisés dans l'informatique scientifique avec Python?Comment les tableaux sont-ils utilisés dans l'informatique scientifique avec Python?Apr 25, 2025 am 12:28 AM

ArraySinpython, en particulier Vianumpy, arecrucialinsciciencomputingfortheirefficiency andversatity.1) ils sont les opérations de data-analyse et la machineauning.2)

Comment gérez-vous différentes versions Python sur le même système?Comment gérez-vous différentes versions Python sur le même système?Apr 25, 2025 am 12:24 AM

Vous pouvez gérer différentes versions Python en utilisant Pyenv, Venv et Anaconda. 1) Utilisez PYENV pour gérer plusieurs versions Python: installer PYENV, définir les versions globales et locales. 2) Utilisez VENV pour créer un environnement virtuel pour isoler les dépendances du projet. 3) Utilisez Anaconda pour gérer les versions Python dans votre projet de science des données. 4) Gardez le Système Python pour les tâches au niveau du système. Grâce à ces outils et stratégies, vous pouvez gérer efficacement différentes versions de Python pour assurer le bon fonctionnement du projet.

Quels sont les avantages de l'utilisation de tableaux Numpy sur des tableaux Python standard?Quels sont les avantages de l'utilisation de tableaux Numpy sur des tableaux Python standard?Apr 25, 2025 am 12:21 AM

NumpyArrayShaveSeveralAdvantages OverStandardPyThonarRays: 1) TheaReMuchfasterDuetoc-bases Implementation, 2) Ils sont économisés par le therdémor

Comment la nature homogène des tableaux affecte-t-elle les performances?Comment la nature homogène des tableaux affecte-t-elle les performances?Apr 25, 2025 am 12:13 AM

L'impact de l'homogénéité des tableaux sur les performances est double: 1) L'homogénéité permet au compilateur d'optimiser l'accès à la mémoire et d'améliorer les performances; 2) mais limite la diversité du type, ce qui peut conduire à l'inefficacité. En bref, le choix de la bonne structure de données est crucial.

Quelles sont les meilleures pratiques pour écrire des scripts Python exécutables?Quelles sont les meilleures pratiques pour écrire des scripts Python exécutables?Apr 25, 2025 am 12:11 AM

Tocraftexecutablepythonscripts, suivant les autres proches: 1) addashebangline (#! / Usr / bin / leppython3) tomakethescriptexecutable.2) setpermisessionswithchmod xyour_script.py.3) organisationwithacleardocstringanduseifname == "__ __" Main __ ".

En quoi les tableaux Numpy diffèrent-ils des tableaux créés à l'aide du module de tableau?En quoi les tableaux Numpy diffèrent-ils des tableaux créés à l'aide du module de tableau?Apr 24, 2025 pm 03:53 PM

NumpyArraysarebetterFornumericalOperations andMulti-dimensionaldata, tandis que la réalisation de la réalisation

Comment l'utilisation des tableaux Numpy se compare-t-il à l'utilisation des tableaux de modules de tableau dans Python?Comment l'utilisation des tableaux Numpy se compare-t-il à l'utilisation des tableaux de modules de tableau dans Python?Apr 24, 2025 pm 03:49 PM

NumpyArraysareBetterForheAVYVumericalComputing, tandis que la réalisation de points contraints de réalisation.1) NumpyArraySoFerversATACTORATIONS ajusté pour les données

Comment le module CTYPES est-il lié aux tableaux dans Python?Comment le module CTYPES est-il lié aux tableaux dans Python?Apr 24, 2025 pm 03:45 PM

CTYPESALLOWSCREATINGAndMANIPulationc-styLearRaySInpython.1) UsectypeStOinterfaceWithClibraryForPerformance.2) Createc-stylearRaysFornumericalComptations.3) PassArrayStocfunction

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Adaptateur de serveur SAP NetWeaver pour Eclipse

Adaptateur de serveur SAP NetWeaver pour Eclipse

Intégrez Eclipse au serveur d'applications SAP NetWeaver.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft