如何使用Python进行大规模开发?

时间:2008-10-25 13:30:28

标签: python development-environment

我有兴趣了解Python中的大规模开发,尤其是如何维护大型代码库?

  • 当您对方法的签名进行不兼容更改时,如何找到调用该方法的所有位置。在C ++ / Java中,编译器会为您找到它,您如何在Python中完成它?

  • 当您在代码内部进行更改时,如何查找实例提供的操作,因为您没有要查找的静态类型?

  • 如何处理/防止输入错误(拼写错误)?

  • UnitTest是否用作静态类型检查的替代?

您可以猜到我几乎只使用静态类型语言(C ++ / Java),但我想尝试使用Python来处理更大的程序。但很久以前,我使用限幅器(dBase)语言进行了非常糟糕的体验,这种语言也是动态输入的。

8 个答案:

答案 0 :(得分:62)

不要使用螺丝刀作为锤子

Python不是静态类型语言,所以不要试图以这种方式使用它。

使用特定工具时,可以将其用于构建的工具。对于Python,它意味着:

  • 鸭子打字:没有类型检查。只有行为很重要。因此,您的代码必须设计为使用此功能。一个好的设计意味着通用签名,组件之间没有依赖关系,高抽象级别。所以如果你改变任何东西,你就不必改变其余的代码。 Python也不会抱怨它是为它构建的。类型不是问题。

  • 巨大的标准库。如果您使用自己未编码的标准功能,则无需更改程序中的所有呼叫。而且Python附带电池。我每天都在发现它们。我不知道我开始时可以使用的模块数量,并试图像每个人一样重写现有的东西。没关系,你从一开始就做不到。

你不用同样的方式编写Java,C ++,Python,PHP,Erlang等等。它们是很好的理由,为什么有这么多不同语言的空间,他们不会做同样的事情。

单元测试不是替代

必须使用任何语言执行单元测试。最着名的单元测试库(JUnit)来自Java世界!

这与类型无关。你再次检查行为。你可以避免回归问题。您可以确保您的客户在轨道上。

用于大型项目的Python

  

语言,图书馆和框架   不要扩展。架构呢。

如果你设计一个坚固的架构,如果你能够让它快速发展,那么它将会扩展。单元测试也有帮助,自动代码检查也是如此。但它们只是安全网。小的。

Python特别适用于大型项目,因为它强制执行一些良好实践,并且内置了许多常用的设计模式。但同样,不要将它用于未设计的内容。例如:Python不是用于CPU密集型任务的技术。

在一个庞大的项目中,无论如何,你很可能会使用几种不同的技术。作为SGBD(法语为DBMS)和模板语言,或者。 Python也不例外。

您可能希望将C / C ++用于需要快速执行的代码部分。或者Java适合Tomcat环境。不知道,不在乎。 Python可以很好地适应这些。

作为结论

我的回答可能有点粗鲁,但不要误会我的意思:这是一个非常好的问题。

很多人都习惯性地来到Python。我试图像Python一样编写Java代码。你可以,但永远不会得到最好的。

如果你玩过/想要玩Python,那就太好了!这是一个很棒的工具。但实际上只是一种工具。

答案 1 :(得分:36)

我有一些修改“Frets On Fire”的经验,这是一个开源python“吉他英雄”克隆。

正如我所看到的,python并不适合真正的大型项目。

我发现自己花费了很大一部分开发时间来调试与不兼容类型的分配相关的问题,静态类型的laguages将在编译时毫不费力地显示出来。 此外,由于类型是在运行时确定的,因此尝试理解现有代码会变得更难,因为您不知道您当前正在查看的参数类型是什么。

除此之外,使用带有__getattr__内置函数的名称字符串调用函数通常在Python中比在其他编程语言中更常见,因此将调用图调到某个函数有点困难(尽管你可以使用某些静态类型语言调用其名称的函数。)

我认为Python在小型软件,快速原型开发以及将现有程序粘合在一起真的很棒,但我不会将它用于大型软件项目,因为在这些类型的程序中,可维护性成为真正的问题,并且我认为python相对较弱。

答案 2 :(得分:22)

由于没有人指出pychecker,pylint和类似的工具,我会:pychecker和pylint是可以帮助你找到错误假设的工具(关于函数签名,对象属性等)他们不会找到编译器可能的所有内容找到一种静态类型的语言 - 但是他们也可以找到这些语言的编译器无法找到的问题。

Python(以及任何动态类型语言)在您可能导致的错误以及如何检测和修复它们方面存在根本的不同。它有明显的缺点和好处,但许多人(包括我)会认为,在Python的情况下,编写代码的容易程度(以及在结构上听起来很容易)以及在没有破坏的情况下修改代码 API兼容性(添加新的可选参数,提供具有相同方法和属性集的不同对象)使其适用于大型代码库。

答案 3 :(得分:16)

我的0.10欧元:

我在'生产'状态下有几个python应用程序。我们公司使用java,c ++和python。我们用eclipse ide(python的pydev)开发

单元测试是问题的关键解决方案。(也适用于c ++和java)

不太安全的“动态打字”世界会让您对代码质量不那么粗心

按方式

大规模开发并不意味着您使用一种语言!

大规模开发通常使用少数特定于该问题的语言

所以我同意锤子问题: - )


PS:static-typing & python

答案 4 :(得分:16)

以下是一些帮助我在python中维护一个相当大的系统的项目。

  • 在图层中构建代码。即分离业务逻辑,表示逻辑和持久层。投入一些时间来定义这些层,并确保项目中的每个人都参与进来。对于大型系统来说,创建一个迫使您进入某种开发方式的框架也是关键。

  • 测试很关键,如果没有单元测试,您可能会比其他语言快几倍地使用无法管理的代码库。请记住,单元测试通常是不够的,请确保在任何重大更改后可以快速运行多个集成/验收测试。

  • 使用Fail Fast原则。为您认为代码可能容易受到攻击的案例添加断言。

  • 具有标准的日志记录/错误处理功能,可帮助您快速导航到问题

  • 使用IDE(pyDev适用于我)提供类型提前,pyLint / Checker集成,以帮助您立即检测常见错别字并提升一些编码标准

  • 小心你的进口,永远不要从x import *或不使用的相关进口。

  • 重构,带有正则表达式的搜索/替换工具通常都需要移动方法/类类型重构。

答案 5 :(得分:8)

对方法签名的不兼容更改。这在Python中不会像在Java和C ++中那样发生。

Python具有可选参数,默认值以及定义方法签名的灵活性。另外,鸭子打字意味着 - 例如 - 作为重大软件更改的一部分,您不必从某个类切换到接口。事情并不复杂。

如何找到调用该方法的所有位置? grep适用于动态语言。如果你需要知道每个地方使用一个方法,grep(或等效的IDE支持的搜索)效果很好。

如何找出实例提供的操作,因为您没有要查找的静态类型?

一个。看看来源。您没有对象库和jar文件的Java / C ++问题。您不需要这些语言所需的所有精心设计和工具。

湾IDE可以在许多常见情况下提供签名信息。您可以轻松地击败IDE的推理能力。当发生这种情况时,你应该回顾一下你正在做的事情以确保它有意义。如果您的IDE无法推断出您的类型信息,那么它可能过于动态了。

℃。在Python中,您经常使用交互式解释器。与Java和C ++不同,您可以直接和交互式地探索实例。您不需要复杂的IDE。

示例:

  >>> x= SomeClass()
  >>> dir(x)

如何处理/防止输入错误?与静态语言相同:您不会阻止它们。你找到并纠正它们。 Java只能找到某类错别字。如果你有两个相似的类或变量名,那么即使使用静态类型检查,你也会陷入深深的麻烦。

示例:

class MyClass { }
class MyClassx extends MyClass { }

具有这两个类名的拼写错误可能会造成严重破坏。 “但我不会把自己置于Java的那个位置,”人们说。同意。我也不会把自己置于Python的那个位置;你创造了截然不同的课程,如果他们被误用,他们会提前失败。]

UnitTest是否用作静态类型检查的替代?以下是另一种观点:静态类型检查可以替代清晰简单的设计。

我和那些不确定应用程序工作原理的程序员一起工作过。他们无法弄清楚为什么事情没有编译;我不知道抽象超类和接口之间的区别,并且无法弄清楚为什么在一个单独的JAR文件崩溃中使一些其他模块发生变化。静态类型检查使他们对有缺陷的设计缺乏信心。

动态语言使程序变得简单。简单性是静态类型检查的替代品。 Clarity是静态类型检查的替代品。

答案 6 :(得分:3)

我的一般经验法则是为小型非任务关键型项目使用动态语言,为大型项目使用静态类型语言。我发现用动态语言(如python)编写的代码会更快地“纠结”。部分原因是因为用动态语言编写代码要快得多,这会导致快捷方式和更糟糕的设计,至少在我的情况下如此。部分原因是因为我使用IntelliJ进行快速简便的重构,而我使用的是Java,而我没有python。

答案 7 :(得分:2)

通常的答案是测试测试。您应该拥有一个广泛的单元测试套件并经常运行,特别是在新版本上线之前。

动态类型语言的支持者认为你必须进行测试,因为即使在静态类型语言中,对类型系统原始规则的一致性也仅涵盖可能出错的一小部分。