Python缺乏静态类型如何影响大型项目的可维护性和可扩展性?

JnB*_*ymn 18 python java project-management static-typing

在阅读了这个非常有用的信息(尽管有点争论性)之后,我想了解您使用Python编写大型项目的经验.随着项目变得更大,事情变得无法管理吗?这种担忧是让我依赖Java的一件事.因此,我会特别感兴趣的知情对于大型项目的可维护性和Java和Python的可扩展性的比较.

Wai*_*ung 16

我研究用Python完成的大规模商业产品.我粗略估计了5000个文件x每行500行.那是大约250万行的Python.请注意,这个项目的复杂性可能相当于其他语言的10 mil +代码行.我没有听到过一位抱怨Python代码无法维护的工程师/架构师/经理.从我从错误跟踪器中看到的情况来看,我没有看到静态类型检查可以避免的任何系统问题.事实上,根本不使用对象类型会产生很少的错误.

我认为这是一个非常好的学术主题,通过实证研究为什么基于静态类的语言似乎并不像人们想象的那样重要.

关于可扩展性.我们刚刚在我们的产品中的数据库1之上添加了一个数据库2,它们都是非SQL的.没有与类型检查相关的问题.首先,我们设计了一个足够灵活的API来预测不同的底层实现.我认为动态语言在这方面是一种帮助而不是阻碍.当我们继续测试和修复错误时,我们正在研究那些在任何语言上工作的人都必须面对的错误.例如,内存使用问题,一致性和参照完整性问题,错误处理问题.我没有看到静态类型检查对这些挑战有任何帮助.另一方面,我们通过能够在飞行途中或简单修补后注入代码,从动态语言中获益匪浅.

可以肯定地说,我们100多名工程师中的大多数人都使用Python感到高兴和高效.对于我们来说,使用静态类型语言在相同的时间内以相同的质量构建相同的产品可能是不可想象的.


roo*_*ook 8

根据我的经验,静态类型语言可能难以维护.例如,假设您有一个实用程序函数,它接受自定义类作为参数.如果你在路上采用新的命名约定,那么这个类的名称将不得不改变,然后你的所有实用函数也必须改变.在像python这样的语言中,只要在类中实现相同的方法,就没有关系.

就个人而言,我鄙视一种妨碍我的语言.表达你的想法的速度是有价值的,这是Python相对于Java的优势.

  • 您的命名约定示例没有任何意义:1.在Python和Java中,您_never_将类的名称传递给函数,除非您遇到麻烦或具有_very_特定用例.2.与无反射的Java代码相反,由于动态类型的原因,Python代码_不能被确定性地重构为使用新的方法名称.3. Pythonic代码遵循PEP8命名约定,大多数Java遵循ConventionLikeThis,当你必须混合所有使用Defacto约定的Defacto库时,你为什么要使用自己的约定? (3认同)
  • 我正在研究人类历史上目前最糟糕的 Java 代码库。它充满了不必要的全局状态、什么都不做的语句(包括什么都不做的匿名类实例化)、不必要的自定义类加载器、文件系统中散落着随机垃圾、竞争条件,谁知道还有什么,但它仍然相对容易使用... 为什么?因为它是一种简单的语言,尽管 Python 太……静态类型的全部目的是让一切都**静态**;即:**易于分析**。 (2认同)

zel*_*lus 5

python中没有良好测试覆盖率的大型代码库可能是一个问题.但这只是图像的一部分.这完全取决于人们和合适的方法来完成这项工作.

没有

  • 源控制
  • 错误跟踪
  • 单元测试
  • 致力于团队

你可能会因任何语言而失败.

  • 我的经验是,Python代码库对初始开发人员已经开始工作后负责维护代码的新开发人员不太宽容.我遇到的特定代码库没有任何单元测试,这意味着所有错误只能在集成测试中捕获或者(在现场经常发生).静态类型语言可以捕捉到你可以犯下的一些愚蠢错误,但它肯定不是一个神奇的子弹. (4认同)

Ter*_*nce 5

尝试在具有大量 IoC 或其他设计模式的大型动态类型框架中追溯明显格式错误的对象的来源,其中对象无法直接追溯到堆栈。

现在尝试在静态类型语言中执行此操作。

除非对象的类型被记录在使用站点附近(例如,通过类型注释,a-la Python 的类型安全库)或堆栈上的某个地方,推断它来自哪里几乎是不可能的。我是根据经验说的,我曾尝试调试 BuildBot 框架的某些部分。它涉及通过框架搜索大量原始文本,甚至使用 PyDev、Komodo 和 Wingware 等花哨的 IDE。

我不怀疑可以对动态语言强加一些类型约束,但缺乏任何标准化似乎是任何试图调试大型现有框架的一部分的人的障碍。

编辑:自 2014 年以来,Guido 添加了 PEP484、MyPy 和打字模块。这让我在维护大型项目方面的经验变得更好。