Python 中输入的影响

python 中输入的影响

Python 3.5 版本引入的类型提示增强了代码可读性,方便多人协作开发。

类型提示的必要性

在强类型语言(如 Java、C++)中,依赖注入(DI)至关重要,但在弱类型语言中难以实现。DI 的核心思想是:类不依赖于具体实现,而是依赖于抽象接口,因为接口比实现更稳定。 错误示范:

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

登录后复制

此例中,加油站只能为特定类型的汽车加油,且缺乏类型定义,可能导致运行时错误。改进后的代码:

立即学习“Python免费学习笔记(深入)”;

from typing import Protocolclass Vehicle(Protocol):    def fill(self, amount: int) -> None:        ...class GasStation:    def fill_tank(self, vehicle: Vehicle, amount: int) -> None:        vehicle.fill(amount)

登录后复制

通过 Protocol 定义抽象类 Vehicle,GasStation 类变得更通用,可为任何实现 fill 方法的车辆加油。

PyDIT:简化 Python 依赖注入

PyDIT(Python Dependency Injection with Types)库利用 Python 类型系统简化依赖注入。假设需要在不同数据库(PostgreSQL、MySQL、Oracle、内存数据库或 NoSQL 数据库)中记录用户数据,需要实现数据库连接类,并提供读写删除记录的功能。示例代码:

from time import sleepfrom typing import TypedDictfrom typing_extensions import overridefrom uuid import UUIDfrom src.configs.di import pyditfrom src.adapters.repositories.interfaces.user import UserRepositoryfrom src.constants.injection import memory_repository_config_tokenfrom src.domain.user.models.user import UserModelclass ConfigType(TypedDict):    delay: intclass 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:        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 conflict")

登录后复制

为了确保代码兼容各种数据库技术,定义一个统一的接口:

from abc import abstractmethodfrom typing import Protocolfrom uuid import UUIDfrom src.domain.user.models.user import UserModelclass 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

登录后复制

接下来,初始化依赖项并注入:

from src.adapters.repositories.in_memory.user import MemoryUserRepositoryfrom src.constants.injection import memory_repository_config_tokenfrom .di import pyditfrom .get_db_config import get_db_configdef setup_dependencies():    pydit.add_dependency(get_db_config, token=memory_repository_config_token)    pydit.add_dependency(MemoryUserRepository, "userrepository")

登录后复制

最后,将依赖项注入到创建用户的模块中:

from typing import castfrom src.adapters.repositories.interfaces.user import UserRepositoryfrom src.configs.di import pyditfrom src.domain.user.models.create_user import CreateUserModelfrom src.domain.user.models.user import UserModelfrom src.domain.user.services.create import CreateUserServicefrom src.domain.user.services.list import ListUsersServiceclass 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()

登录后复制

依赖项作为属性注入,可以通过 self 或 module.user_repository 访问。 PyDIT 支持各种项目配置场景,并遵循 SOLID 原则。 项目地址:GitHub, LinkedIn: Marcelo Almeida (mrm4rc), PyPI: python-pydit

以上就是Python 中输入的影响的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2079306.html

(0)
上一篇 2025年2月24日 09:24:48
下一篇 2025年2月24日 09:25:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • PS卡在载入界面怎么办?

    PS卡在载入界面可能是由软件自身(文件损坏或插件冲突)、系统环境(驱动过时或系统文件损坏)或硬件(硬盘损坏或内存条故障)问题造成的。首先检查计算机资源是否充足,关闭后台程序释放内存和CPU资源。修复PS安装或检查插件是否存在兼容性问题。更新…

    2025年3月30日
    100
  • PS一直显示正在载入是什么原因?

    PS“正在载入”问题是由资源访问或处理问题引起的:硬盘读取速度慢或有坏道:使用CrystalDiskInfo检查硬盘健康状况并更换有问题的硬盘。内存不足:升级内存以满足PS对高分辨率图片和复杂图层处理的需求。显卡驱动程序过时或损坏:更新驱动…

    2025年3月30日
    100
  • PS启动时一直显示正在载入如何解决?

    PS启动时卡在“正在载入”可能是由于各种原因造成的:禁用损坏或冲突的插件。删除或重命名损坏的配置文件。关闭不必要的程序或升级内存,避免内存不足。升级到固态硬盘,加快硬盘读取速度。重装PS修复损坏的系统文件或安装包问题。查看错误日志分析启动过…

    2025年3月30日
    100
  • PS打开文件时一直显示正在载入如何解决?

    PS打开文件时出现“正在载入”卡顿,原因可能包括:文件过大或损坏、内存不足、硬盘速度慢、显卡驱动问题、PS版本或插件冲突。解决方法依次为:检查文件大小和完整性、增加内存、升级硬盘、更新显卡驱动、卸载或禁用可疑插件、重装PS。通过逐步排查,并…

    2025年3月30日
    100
  • 如何加快PS的载入速度?

    解决 Photoshop 启动慢的问题需要多管齐下,包括:升级硬件(内存、固态硬盘、CPU);卸载过时或不兼容的插件;定期清理系统垃圾和过多的后台程序;谨慎关闭无关紧要的程序;启动时避免打开大量文件。 Photoshop启动慢?这问题我太熟…

    2025年3月30日
    100
  • PS载入慢与电脑配置有关吗?

    PS载入慢的原因在于硬件(CPU、内存、硬盘、显卡)和软件(系统、后台程序)的综合影响。解决方法包括:升级硬件(尤其是更换固态硬盘),优化软件(清理系统垃圾、更新驱动、检查PS设置),处理PS文件。定期维护电脑也有助于提升PS运行速度。 P…

    2025年3月30日
    100
  • PS载入慢与硬盘速度有关吗?

    硬盘速度可能导致 PS 启动缓慢,但并非唯一原因。启动过程涉及多种任务,例如资源解压、插件加载和数据结构初始化,其中任何环节卡壳都会延长启动时间。系统配置(内存不足、CPU 性能不足)、系统问题以及安装位置也会影响启动速度。综合考虑硬件配置…

    2025年3月30日
    100
  • Vue项目中,main.js引入scss文件报错的原因是什么?

    main.js中引入scss,组件中报错的原因 在使用vue构建前端项目时,经常需要定义一些全局变量,比如字体颜色、背景色等。通过在main.js中直接引入scss文件,可以很方便地在整个项目中使用这些变量。然而,这样做可能会遇到错误。 原…

    编程技术 2025年3月29日
    100
  • html2canvas截图清晰但图片模糊怎么办?

    页面截取清晰,但图片模糊:html2canvas 问题解决 在使用 html2canvas 将页面截取为图片时,虽然整体图像清晰度令人满意,但原本页面中包含的图像却依然模糊不清。对于这一问题,解决方案如下: **GitHub 链接** 登录…

    编程技术 2025年3月29日
    100
  • 手机端Rem+Flex布局九宫格出现缝隙:如何解决块元素间细微间距问题?

    css 手机端rem与flex布局九宫格:解决块间缝隙问题 在使用css进行手机端适配时,常常会遇到一些棘手的问题。本文将探讨一个常见的难题:在采用rem单位和flex布局实现九宫格布局时,部分手机型号上块元素之间出现细微缝隙的问题。 问题…

    编程技术 2025年3月29日
    100

发表回复

登录后才能评论