python依赖注入_如何做依赖注入python方式?

这一切都取决于情况.例如,如果您使用依赖注入来进行测试,所以您可以轻松地嘲笑某些内容 – 您可以经常放弃注入:您可以嘲笑您将注入的模块或类:

subprocess.Popen = some_mock_Popen

result = subprocess.call(...)

assert some_mock_popen.result == result

subprocess.call()将调用subprocess.Popen(),我们可以模拟它,而不必以特殊的方式注入依赖.我们可以直接替换subprocess.Popen. (这只是一个例子;在现实生活中,你会以更加健壮的方式做到这一点)

如果对更复杂的情况使用依赖注入,或者模拟整个模块或类不适用(因为例如,您只想嘲弄一个特定的调用),则使用类属性或模块全局变量作为依赖项是通常的选择.例如,考虑到一个my_subprocess.py:

from subprocess import Popen

def my_call(...):

return Popen(...).communicate()

您只能通过分配给my_subprocess.Popen来轻松替换由my_call()创建的Popen调用;它不会影响任何其他调用subprocess.Popen(但它会替换所有调用my_subprocess.Popen,当然).类似地,类属性:

class MyClass(object):

Popen = staticmethod(subprocess.Popen)

def call(self):

return self.Popen(...).communicate(...)

当使用这样的类属性时,考虑到这些选项很少需要,你应该注意使用staticmethod.如果不这样做,并且您插入的对象是一个正常的函数对象或另一种类型的描述符,就像一个属性,在从类或实例中检索到时,会执行一些特殊的描述,它会做错事.更糟糕的是,如果你现在使用的东西不是一个描述符(比如subprocess.Popen类,在这个例子中),它现在就可以工作,但是如果有问题的对象改变了一个正常的功能,那么它将会令人困惑.

最后,只有简单的回调;如果您只想将特定实例的类绑定到特定的服务,则可以将服务(或一项或多项服务的方法)传递给类初始化程序,并使用它:

class MyClass(object):

def __init__(self, authenticate=None, authorize=None):

if authenticate is None:

authenticate = default_authenticate

if authorize is None:

authorize = default_authorize

self.authenticate = authenticate

self.authorize = authorize

def request(self, user, password, action):

self.authenticate(user, password)

self.authorize(user, action)

self._do_request(action)

...

helper = AuthService(...)

# Pass bound methods to helper.authenticate and helper.authorize to MyClass.

inst = MyClass(authenticate=helper.authenticate, authorize=helper.authorize)

inst.request(...)

当设置这样的实例属性时,您不必担心描述符触发,所以只需分配函数(或类或其他可调用或实例)即可.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解

java代码实现访问网络外部接口并获取数据的工具类工具类代码,可以直接copy使用package com.yqzj.util;import org.apache.log4j.LogManager;import org.apache.log4j.Logger;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.i…

「技术人生」第2篇:学会分析事物的本质

简介: 对于研发同学而言,探究事物的本质,是最基础最核心最先需要被掌握的技能,没有之一。 作者:贺科学 技术一号位不是岗位,更多的是技术人员在公司中做事的一种心态,这个系列的文章适合所有想…

低代码能做什么?这家服务商用钉钉宜搭打造了智慧医院管理应用

简介: 谷瞰在医疗信息化领域积累的专业解决方案,如果能加持宜搭轻量级、高度灵活、极高效的开发支撑能力,可能是找到智慧医院快速落地的最优解。 “疫情作为催化剂,加速了医疗信息化的发展”,浙江谷瞰信息有限公司董事…

python socket能做什么_[python]初探socket

1.什么是socket?Socket中文译作:套接字,但是大家一般约定俗称的都用:socket。我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立‘通信’的基础,建立连接,传输数据——…

mysql sysdate本周_oracle 、mysql 取昨天 前天 本周 数据

查询今天数据:SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,‘YYYY-MM-DD‘)TO_CHAR(SYSDATE,‘YYYY-MM-DD‘)查询昨天数据:SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,‘YYYY-MM-DD‘)TO_CHAR(SYSDATE-1,‘YYYY-MM-DD‘)…

Fortinet:行走在网络和安全融合领域的最前列

近日,Fortinet 核心操作系统的演进暨 Fortinet SD-WAN 在2021年度Gartner 广域网边缘基础设施魔力象限的位置及其关键能力与场景宣讲成功举办。会议指出,在数字化转型过程中,攻击平面成倍增长、边缘无处不在,没有“安全”的“网络…

如何通过Graph+AI的方法打造高精度风控模型

简介: 阿里云图智能平台在金融行业已经帮助银行、保险等领域客户构建了金融风控、商品推荐、循环担保检测、异常指标监控、违规团伙挖掘等场景,通过穿透行业应用场景,帮助客户基于多维数据做出精准决策。 >>发布会传送门:h…

python虚拟环境安装的包在哪_如何使用virtualenv引导脚本在虚拟环境中安装python包?...

我想创建一个引导脚本来设置本地环境并在其中安装所有要求.我一直在尝试使用virtualenv.create_bootstrap_script,如docs所述.import virtualenvs virtualenv.create_bootstrap_script(import subprocessdef after_install(options, home_dir):subprocess.call([pip, install,…

实操指南 | Resource Queue如何实现对AnalyticDB PostgreSQL的资源管理?

简介: 作者:阿里云数据库OLAP产品部 - 子华 一 背景 AnalyticDB PostgreSQL版(简称ADB PG)是阿里云数据库团队基于PostgreSQL内核(简称PG)打造的一款云原生数据仓库产品。在数据实时交互式分析、HTAP、ETL…

python均分纸牌_Python实现比较扑克牌大小程序代码示例

是Udacity课程的第一个项目。先从宏观把握一下思路,目的是做一个比较德州扑克大小的问题首先,先抽象出一个处理的函数,它根据返回值的大小给出结果。之后我们在定义如何比较两个或者多个手牌的大小,为方便比较大小,我们…

底层基础软件崛起,达梦数据库的选择与收获

作者 | 宋慧 出品 | CSDN 作为基础软件三驾马车之一,数据库一直是 IT 系统的核心。中国 IT 应用发展迅速,创新的应用场景为操作系统、数据库这样的底层基础软件提供了新的发展机会。基础数据成为“十四五”的重点关注方向,中国数据库正在快…

Apache Flink在 bilibili 的多元化探索与实践

简介: bilibili 万亿级传输分发架构的落地,以及 AI 领域如何基于 Flink 打造一套完善的预处理实时 Pipeline。 本文由 bilibili 大数据实时平台负责人郑志升分享,本次分享核心讲解万亿级传输分发架构的落地,以及 AI 领域如何基于 …

【开通指南】 实时计算 Flink 全托管版本

简介: 【开通指南】实时计算 Flink 全托管版本 1、试用的实时计算 Flink 版产品是后付费还是预付费?是否有额外费用产生? 预付费,有额外的SLB费用,一天2元封顶。(开通 Flink 全托管产品,需使用…

tomcat启动成功 未加载项目_喜讯!济宁医学院附属医院SPD项目成功启动

济宁医学院附属医院(简称济医附院)始建于1951年,医院拥有79个临床科室,9个重症监护病区,开放床位3028张,是山东省首家通过JCI认证的大型综合医院,作为山东省区域医疗中心,早在2016年,医院就通过…

java like a_如何在Java中实现类似“ LIKE”运算符的SQL?

我需要Java中的比较器,该比较器的语义与sql"赞"运算符相同。例如:myComparator.like("digital","%ital%");myComparator.like("digital","%gi?a%");myComparator.like("digital","di…

Mendix发布全球低代码报告,中国软件与低代码发展远超全球

调查显示: 1、86%的受访者表示,企业对于开发人员的需求已经达到了白热化的程度。另外,78%的受访企业表示会依靠非技术人员来缓解IT部门的压力。 2、低代码开发用于标准化数据安全、数据建模和可视化、现有工作流程自动化等应用。 3、受访的IT…

Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域

简介: Vineyard 是一个专为云原生环境下大数据分析场景中端到端工作流提供内存数据共享的分布式引擎,我们很高兴宣布 Vineyard 在 2021 年 4 月 27 日被云原生基金会(CNCF)TOC 接受为沙箱(Sandbox)项目。 作…

java 电子编号生成器_业务编号生成器

在我们实际做项目的过程中,时常需要生成一些跟业务相关的一些唯一的业务编号,这些编号又需要一定的规则,一般是每生成一个新的编号是在前一个编号的集成上尾号递增1个单位,下面是我业余时间写的一个编号生成器,直接贴代…

殷浩详解DDD:领域层设计规范

简介: 在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层、基础设施层的设计。但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Entity、ValueObject …

arcgis怎么用python重新排序_python - 根据排序数据添加新的顺序ID号(ArcGIS) - 堆栈内存溢出...

我需要一行代码,它将根据我为数据规定的顺序发出新的顺序ID。 基本上,在按照我的喜好对数据进行排序后,原始的Object_Id对我来说不再是有意义的顺序。 在我的表中,我创建了一个新字段(短整数)。 在现场计算器的预逻辑脚本框中&…