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

问题:

在Java中IoC / DI是一种非常普遍的做法,广泛应用于Web应用程序,几乎所有可用的框架和Java EE。另一方面,还有很多大型的Python Web应用程序,但除了Zope(我听说应该是非常糟糕的代码)之外,IoC在Python世界似乎并不常见。 (请注意一些例子,如果你认为我错了)。
当然有几个可用于Python的Java IoC框架的克隆,例如springpython。但是他们似乎都不习惯。至少,我从来没有使用这样的Djangosqlalchemy <insert your favorite wsgi toolkit here>的网络应用程序。
在我看来,IoC具有合理的优势,并且可以方便地替换django-default-user-model,但Python中的接口类和IoC的广泛使用看起来有点奇怪,而不是“pythonic”。但也许有人有更好的解释,为什么IoC在Python中不被广泛使用。

回答:

我并不认为DI / IoC在Python中是不常见的。然而,is不常见的是DI / IoC frameworks/containers
想想一下:DI容器做什么?它允许你

  1. 将独立组件连接在一起完整应用程序…
  2. …在运行时

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

  1. 脚本
  2. 动态

所以,DI容器只不过是动态脚本语言的解释器。实际上,让我再说一遍:一个典型的Java / .NET DI容器只不过是一个非常糟糕的动态脚本语言的拙劣的解释器,而且这种语法很简单,有时候是基于XML的语法。
当您使用Python编程时,为什么要在使用美观,精湛的脚本语言的时候使用丑陋的脚本语言?实际上,这是一个更普遍的问题:当你几乎用任何语言进行编程时,为什么在使用Jython和IronPython的时候,为什么要使用一个丑陋的坏脚本语言?
所以,要总结一下:DI / IoC的practice与Python中一样重要,就像在Java中一样重要,原因相同。然而,DI / IoC的implementation内置于语言中,通常非常轻巧,完全消失。
(这里简单介绍一下:在汇编中,子程序调用是一个很大的交易 – 你必须将你的局部变量和寄存器保存到内存中,将你的返回地址保存在某个地方,将指令指针改变到你调用的子例程,安排它以某种方式跳回到你的子程序完成后,将参数放在被叫方可以找到的地方,等等。IOW:在程序集中,“子程序调用”是一个设计模式,之前有一些语言Fortran内置了子程序调用,人们正在构建自己的“子例程框架”,你可以说这个子程序调用在Python中是“不常见的”,只是因为你不使用子程序框架?
BTW:以DI为逻辑结论的一个例子,看看Gilad BrachaNewspeak Programming Language及其关于这个主题的着作:

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why is IoC / DI not common in Python?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 + 1 =