为什么 IoC/DI 在 Python 中不常见?

2024-01-23

In Java IoC http://en.wikipedia.org/wiki/Inversion_of_Control / DI http://en.wikipedia.org/wiki/Dependency_Injection是一种非常常见的做法,广泛用于 Web 应用程序、几乎所有可用的框架和 Java EE。另一方面,也有很多大型 Python Web 应用程序,但除了 Zope(我听说它编码起来真的很糟糕)之外,IoC 在 Python 世界中似乎并不常见。 (如果您认为我错了,请举一些例子)。

当然,有几个流行的 Java IoC 框架的克隆版本可用于 Python,弹簧蟒蛇 http://springpython.webfactional.com/例如。但它们似乎都没有被实际使用。至少,我从来没有遇到过Django http://www.djangoproject.com/ or sqlalchemy http://www.sqlalchemy.org/+<insert your favorite wsgi toolkit here>基于网络应用程序,使用类似的东西。

在我看来,IoC 具有合理的优势,并且可以轻松替换 django-default-user-model,但在 Python 中广泛使用接口类和 IoC 看起来有点奇怪,而且不“pythonic”。但也许有人有更好的解释,为什么 IoC 没有在 Python 中广泛使用。


我实际上并不认为 DI/IoC 是that在 Python 中不常见。什么is然而,不常见的是 DI/IoC框架/容器.

想一想:DI 容器是做什么的?它可以让你

  1. 将独立组件连接到一个完整的应用程序中...
  2. ...在运行时。

我们有“连接在一起”和“运行时”的名称:

  1. 脚本编写
  2. dynamic

因此,DI 容器只不过是动态脚本语言的解释器。实际上,让我重新表述一下:典型的 Java/.NET DI 容器只不过是一个蹩脚的解释器,用于一种非常糟糕的动态脚本语言,其语法非常丑陋,有时是基于 XML 的。

当您使用 Python 编程时,当您拥有一种漂亮、出色的脚本语言时,为什么要使用一种丑陋、糟糕的脚本语言呢?实际上,这是一个更普遍的问题:当您使用几乎任何语言进行编程时,如果您可以使用 Jython 和 IronPython,为什么还要使用丑陋、糟糕的脚本语言呢?

所以,回顾一下:practice出于完全相同的原因,DI/IoC 在 Python 中与在 Java 中同样重要。这执行然而,DI/IoC 的功能是内置于语言中的,而且通常非常轻量,以至于完全消失了。

(这里有一个简短的类比:在汇编中,子例程调用是一件非常重要的事情 - 你必须将局部变量和寄存器保存到内存中,将返回地址保存在某处,将指令指针更改为你正在调用的子例程,安排它在完成时以某种方式跳回子例程,将参数放在被调用者可以找到它们的地方,等等。IOW:在汇编中,“子例程调用”是一种设计模式,在出现像这样的语言之前Fortran 内置了子程序调用,人们正在构建自己的“子程序框架”。您是否会说子程序调用在 Python 中“不常见”,只是因为您不使用子程序框架?)

顺便说一句:有关如何通过 DI 得出逻辑结论的示例,请查看吉拉德·布拉查 http://GBracha.BlogSpot.Com/'s 新话编程语言 http://NewspeakLanguage.Org/以及他关于该主题的著作:

  • 构造函数被认为是有害的 http://GBracha.BlogSpot.Com/2007/06/constructors-considered-harmful.html
  • 注射死刑 http://GBracha.BlogSpot.Com/2007/12/some-months-ago-i-wrote-couple-of-posts.html
  • 禁止进口 http://GBracha.BlogSpot.Com/2009/06/ban-on-imports.html (继续 http://GBracha.BlogSpot.Com/2009/07/ban-on-imports-continued.html)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 IoC/DI 在 Python 中不常见? 的相关文章

  • R 提交到 CRAN:构建包的 R 版本?

    我想向 CRAN 提交一个包裹 在里面CRAN 存储库政策 http cran r project org web packages policies html它指出 当发布新的 R x y 0 版本时 R CMD 检查给出 错误 的包将被
  • 无法以联觉方式绘制像素、Pi 数

    我想将 pi 数字的每个数字打印为彩色像素 因此 我得到一个带有 pi 数字的输入 然后将其解析为一个列表 每个节点包含一个数字 我知道 稍后我将使用一个数组 但我从来没有把它画到屏幕上 有人能帮我看看我错在哪里吗 import java
  • Eclipse (C/C++) 错误:平台关闭后发现作业仍在运行

    当我打开 Eclipse 时 它 在一小时前工作过 但在启动时冻结并给出错误 发生错误 请参阅日志文件 请参阅下面的日志文件 尽管其中一些信息出现在日志中 操作系统 Mac OSX 10 7 5 Eclipse 面向 C C 开发人员的 E
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • Image.Save 异常“GDI+ 中发生一般错误。”保存到 MemoryStream 时

    我有一个服务器客户端应用程序 我想从服务器获取屏幕截图 但在线bitmap Save ms System Drawing Imaging ImageFormat Png 我得到这个例外 A generic error occurred in
  • 如何从闪亮模块调用闪亮模块?

    如何从闪亮模块中调用闪亮模块并传递第一个模块中的选择 作为一个例子 我编写了一个应用程序来显示星球大战主题dplyr在 DT data 表中 模块StarWars 来自同一数据集的相关电影应显示在另一个子选项卡 模块电影 的另一个 DT d
  • C++11 中引入了哪些重大更改?

    我知道 C 11 中至少有一项更改会导致一些旧代码停止编译 引入explicit operator bool 在标准库中 替换旧实例operator void 诚然 这将破坏的代码可能是一开始就不应该有效的代码 但它仍然是一个破坏性的变化
  • 当操作系统为 Windows Server 2019 时,ec2 私有子网无法到达 169.254.169.254

    我有多个 ec2 实例在私有子网中运行 仅允许 vpc 内的流量 其中一些实例是自定义操作系统 其中一些实例运行 AWS windows server 2012 ami 有些运行 AWS Windows Server 2019 ami 在所
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么
  • WiX:数字签名 BootStrapper 项目

    我有一个项目 我为其构建了 WiX msi 文件 我还有一个 WiX 引导程序 exe 文件 用于检查 C 2005 是否存在 如果未找到则安装它 然后安装 msi 软件包 我的项目包括作为 msm 文件的 Crystal Reports
  • Java中不同格式的字符串解析为日期

    我想转换String to Date以不同的格式 例如 我从用户那里得到 String fromDate 19 05 2009 i e dd MM yyyy format 我想转换这个fromDate作为日期对象 yyyy MM dd fo
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di
  • 如何添加私有 Spec Repo 以使用私有 Pod?

    我完成了这个教程http guides cocoapods org making private cocoapods html http guides cocoapods org making private cocoapods html但
  • MacOSX 下 libpng 的链接器错误

    我正在使用 MacOSX 10 7 2 和 Xcode 4 2 1 我安装了libpng使用端口 我试图在我的应用程序中加载 PNG 图像 但出现链接器错误 Undefined symbols for architecture x86 64
  • 通过 subprocess.communicate 在 python 脚本之间传输 pickled 对象输出

    我有两个 python 脚本 object generator py 它会腌制给定的对象并打印它 另一个脚本 object consumer py 通过 subprocess communicate 选择第一个脚本的输出 并尝试使用 pic
  • CodeIgniter 2.1.0 的会话库中是否存在任何已知错误?为什么我会被踢出去? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在开发
  • Emacs:导航目录和打开文件的好策略是什么?

    上周 由于必须应对 R 和 Perl 的不同 IDE 我再次感到愤怒 我不喜欢这两种 IDE 也没有使用它们来真正适应 所以我决定尝试 Emacs 我做出这个决定并非没有一定的恐惧 我的主要用途是使用 cperl 来使用 Perl 以及使用
  • R中按字母顺序对每一行字符串进行排序

    我环顾四周 似乎找不到解决这个问题的好方法 我有一个包含行名称的列 我想按字母顺序对每一行进行排序 以便稍后可以识别具有相同名称但顺序不同的行 数据如下 names lt c John D Josh C Karl H John D Bob
  • 标签栏不显示图标?

    我读了一堆相关的问题 我尝试了他们所说的 但没有任何效果 不知道为什么 所以 我有3个不同的UIStoryboards 第一个是处理登录 注册的 Auth Storyboard 并且有一个对第二个 Storyboard 选项卡栏 Story
  • 如何使用 IHttpActionResult 设置标头

    我想将令牌添加到 webapi 请求的标头中 我怎样才能做到这一点 这是我的示例代码 public IHttpActionResult Authenticate Login data var Token fdsf123546fskjhf g

随机推荐