我如何使用Python进行大规模开发?
我有兴趣了解Python的大规模开发,特别是如何维护庞大的代码库?
-
当对方法的签名进行不兼容性更改时,如何查找调用该方法的所有位置? 在C ++ / Java中,编译器会为你find它,你如何在Python中做到这一点?
-
当你在代码的内部进行更改时,如何查找实例提供的操作,因为没有静态types来查找?
-
你如何处理/防止input错误(拼写错误)?
-
UnitTest被用作静态types检查的替代品吗?
正如你所猜测的,我几乎只使用静态types语言(C ++ / Java),但是我想尝试用Python来处理更大的程序。 但是,很久以前,我用一个裁剪(dBase)语言也是一种非常不好的经验,这种语言也是dynamicinput的。
由于没有人指出pychecker,pylint和类似的工具,我会:pychecker和pylint是可以帮助你find不正确的假设(关于函数签名,对象属性等)的工具。他们不会find编译器可能find的所有东西静态types语言 – 但是他们可以发现这样的语言的编译器也找不到这样的问题。
Python(以及任何dynamictypes的语言)在可能导致的错误以及如何检测和修复它们方面有着根本的不同。 它有一定的缺点和好处,但是很多人(包括我)都认为,在Python的情况下,编写代码的简易性(以及易于使其结构合理)以及修改代码而不破坏API兼容性(添加新的可选参数,提供具有相同方法和属性集的不同对象)使其适合大型代码库。
不要使用螺丝刀作为锤子
Python不是一个静态types的语言,所以不要试图以这种方式使用它。
当你使用一个特定的工具时,你可以用它来创build它。 对于Python来说,这意味着:
-
鸭子打字 :没有types检查。 只有行为很重要。 因此,您的代码必须devise为使用此function。 一个好的devise意味着通用签名,组件之间没有依赖关系,高度抽象级别。所以,如果你改变了任何东西,你就不必改变其余的代码。 Python也不会抱怨,它已经build立了什么。 types不是一个问题。
-
巨大的标准库 。 如果您使用自己未编码的标准function,则无需在程序中更改所有呼叫。 和Python来与电池包括在内。 我每天都在发现它们。 当我开始尝试重写现有的东西时,我不知道我可以使用哪些模块。 没关系,你从一开始就不能把事情搞清楚。
你不用编写Java,C ++,Python,PHP,Erlang,也是一样。 他们是为什么有这么多不同语言的每一个都有空间的很好的理由,他们不这样做。
unit testing不是替代品
unit testing必须用任何语言来执行。 最着名的unit testing库( JUnit )来自Java世界!
这与types无关。 你再次检查行为。 你避免了回归的麻烦。 你确保你的客户在轨道上。
用于大型项目的Python
语言,图书馆和框架不能扩展。 体系结构。
如果你devise一个坚实的架构,如果你能够使其发展迅速,那么它将会扩展。 unit testing帮助,自动代码检查以及。 但他们只是安全网。 还有小的
Python特别适用于大型项目,因为它强化了一些良好的实践,并且内置了许多通常的devise模式。 但是,不要把它用于没有devise的东西。 例如:Python不是CPU密集型任务的技术。
在一个巨大的项目中,反正你很可能会使用几种不同的技术。 作为SGBD和模板语言,否则。 Python也不例外。
您可能会想要使用C / C ++代码的一部分,你需要快速。 或Java来适应Tomcat环境。 不知道,不在乎。 Python可以和这些玩得很好。
作为结论
我的回答可能会有些粗鲁,但不要误解我的意思,这是一个很好的问题。
很多人习惯于习惯于Python。 我搞砸了自己试图编写像Python一样的Java。 你可以,但永远不会得到最好的。
如果你玩过/想玩Python,那太棒了! 这是一个奇妙的工具。 但只是一个工具,真的。
我有一些修改“Frets On Fire”的经验,这是一个开源的Python“吉他英雄”的克隆。
就我所见,python并不适合真正大规模的项目。
我发现自己在开发时花费了很大一部分时间来debugging与不兼容types的赋值相关的问题,静态types语言在编译时将毫不费力地显示出来。 另外,因为types是在运行时确定的,试图理解现有的代码变得更加困难,因为你不知道你当前正在查看的参数是什么types。
除此之外,使用__getattr__
内置函数调用函数名称的函数通常在Python中比其他编程语言更常见,因此调用图函数在某种程度上会变得更加困难(尽pipe您可以调用其函数名一些静态types的语言也是如此)。
我认为Python在小规模软件,快速原型开发以及将现有程序粘合在一起方面真的很出彩,但是我不会将它用于大型软件项目,因为在这些types的程序中,可维护性成为真正的问题,在我看来,Python那里比较弱。
我的0.10 EUR:
我有几个python应用程序在“生产”状态。 我们公司使用java,c ++和python。 我们用eclipse IDE开发(pydev for python)
unit testing是解决问题的关键。 (也为c + +和Java)
不太安全的“dynamicinput”的世界将使您不太在意代码质量
顺便说一句 :
大规模的发展并不意味着,你用一种语言!
大规模的开发往往会使用一些特定的语言来解决问题 。
所以我同意的锤子问题 🙂
PS: 静态键入&python
这里有一些项目帮助我在python中维护一个相当大的系统。
-
分层构build你的代码。 即分离biz逻辑,演示逻辑和持久层。 花一点时间来定义这些层次,并确保项目中的每个人都被收购。对于大型系统来说,创build一个框架,迫使你进入某种发展方式也是关键。
-
testing是关键,没有unit testing,你可能会得到比其他语言快几倍的不可翻译的代码库。 请记住,unit testing通常是不够的,确保有几个集成/验收testing,您可以在任何重大更改后快速运行。
-
使用快速失败原则。 为您认为您的代码可能易受攻击的情况添加断言。
-
有标准的日志logging/error handling,这将帮助您快速导航到问题
-
使用提供types的IDE(pyDev适用于我),pyLint / Checker集成,帮助您立即检测常见错误并提升一些编码标准
-
小心你的import,不要从ximport*做,或做相对import不使用。
-
做重构,使用正则expression式的search/replace工具往往是所有你需要做的移动方法/类types重构。
对方法签名的不兼容更改。 Python在Java和C ++中不会发生这种情况。
Python具有可选参数,默认值以及定义方法签名的灵活性。 此外,鸭式打字意味着 – 例如 – 您不必从某个类切换到界面,作为重大软件更改的一部分。 事情并不复杂。
你如何find所有调用该方法的地方? grep适用于dynamic语言。 如果你需要知道每个地方使用的方法,grep(或等效的IDE支持的search)效果很好。
你如何找出一个实例提供的操作,因为你没有一个静态types来查找?
一个。 看看源代码。 您没有对象库和jar文件所面临的Java / C ++问题。 您不需要这些语言所需的所有精细的辅助工具和工具。
湾 IDE可以在许多常见情况下提供签名信息。 您可以轻松地打败IDE的推理能力。 当发生这种情况时,你应该回顾一下你在做什么以确保它是有意义的。 如果你的IDE不能推断出你的types信息,也许它太dynamic了。
C。 在Python中,你经常通过交互式解释器工作。 与Java和C ++不同,您可以直接和交互式地浏览您的实例。 您不需要复杂的IDE。
例:
>>> x= SomeClass() >>> dir(x)
你如何处理/防止打字错误? 和静态语言一样:你不会阻止它们。 你find并纠正它们。 Java只能find某种types的拼写错误。 如果您有两个相似的类名或variables名,即使使用静态types检查,也可能会遇到很大的麻烦。
例:
class MyClass { } class MyClassx extends MyClass { }
带有这两个类名的错字可能会造成严重破坏。 “但是我不会把自己放在Java的位置上,”人们说。 同意。 我也不会把自己放在Python的位置上, 你做的课程是截然不同的,如果被滥用,会早早失败。
UnitTest被用作静态types检查的替代品吗? 另一个观点:静态types检查是清晰,简单devise的替代。
我曾与程序员谁不知道为什么应用程序工作。 他们不知道为什么事情没有编译; 不知道抽象超类和接口之间的区别,也不知道为什么在一个单独的JAR文件崩溃的时候,为什么会有一些其他模块的变化。 静态types检查给了他们错误的devise信心。
dynamic语言允许程序变得简单。 简单性是静态types检查的替代。 清晰度是静态types检查的替代。
通常的答案是testingtestingtesting。 你应该有一个广泛的unit testing套件,并经常运行,特别是在新版本上线之前。
dynamictypes语言的支持者认为你必须进行testing,因为即使在静态types语言中,符合types系统的粗糙规则也只涵盖了可能出错的一小部分。
我的一般经验法则是使用dynamic语言进行小型非关键任务项目和静态types语言进行大型项目。 我发现用Python等dynamic语言编写的代码会更快地“纠结”。 部分原因在于,用dynamic语言编写代码要快得多,而且会导致快捷方式和糟糕的devise,至less在我看来是这样。 部分原因是因为我使用IntelliJ进行快速简单的重构,所以我没有使用Java。