【问题标题】:Is Python good for big software projects (not web based)? [closed]Python 适合大型软件项目(不是基于 Web 的)吗? [关闭]
【发布时间】:2010-09-07 08:05:48
【问题描述】:

现在我主要使用 C/C++ 进行开发,但我用 Python 编写了一些小实用程序来自动化一些任务,我真的很喜欢它作为语言(尤其是生产力)。

除了性能(由于易于将 Python 与 C 模块连接起来,这个问题有时可以解决),您认为它是否适合用于开发独立复杂应用程序的生产用途(例如想文字处理器或图形工具)?

您会推荐什么 IDE?在我看来,Python 提供的 IDLE 甚至对于小型项目也不够用。

【问题讨论】:

  • 这个问题太混乱和多方了。看起来您特别想知道 CPython 的使用,而不是 IronPython 等,但这从未得到澄清。您是只询问语言还是语言+口译员的选择?关于 IDE 的问题完全是另一个话题。如果我问这个问题,我会将其表述为:“对于复杂应用程序的开发来说,CPython 的选择有多好?”
  • 在 2014 年浏览时,我注意到了这个问题,并想指出,在几个 cmets 中作为示例提到的电子表格 Resolver One 已不再积极开发。

标签: python ide


【解决方案1】:

在我看来,python 已经为开发复杂的应用程序做好了充分的准备。我在服务器端看到 python 的力量比编写图形客户端更多。但是看看http://www.resolversystems.com/。他们使用 .net ironpython 端口在 python 中开发了一个完整的电子表格。

如果您熟悉 eclipse,请查看 pydev,它提供了对 python 的自动完成和调试支持以及所有其他 eclipse 好东西,如 svn 支持。开发它的人刚刚被aptana 收购,所以这将是未来的可靠选择。

@Marcin

缺点:作为一种动态语言,有办法 更差的 IDE 支持(正确的语法 完成需要静态类型, 在 Java 中是显式的还是推断的 在 SML 中),

您是对的,静态分析可能无法为动态语言提供完整的语法补全,但我认为 pydev 可以很好地完成这项工作。此外,我在编写 python 时有不同的开发风格。我总是打开一个 ipython 会话,用一个 F5 键,我不仅可以从 ipython 完美完成,还可以进行对象自省和操作。

但是如果你想写第二个谷歌 或雅虎,你会更好 C# 或 Java。

Google just rewrote jaiku 在 App Engine 之上工作,一切都在 python 中。据我所知,他们在谷歌内部也使用了很多 python。

【讨论】:

  • 由于在 python 中实现的性能问题,目前谷歌使用 C++ 重建了他们的一些产品(Youtube 等)。
【解决方案2】:

试试 Django 或 Pylons,用它们编写一个简单的应用程序,然后决定哪一个最适合你。还有其他一些(例如 Turbogears 或 Werkzeug),但这些是最常用的。

【讨论】:

  • 所有这些都是 Web 框架;不是基于网络的应用程序呢?
【解决方案3】:

我只有一次 python 经验,我的垃圾 cli 项目。

我知道可能部分或全部问题取决于我对 python 的缺乏经验。

我发现这些事情令人沮丧:

  1. 很难免费找到一个好的 IDE
  2. 对自动重构的有限支持

此外:

  1. 需要引入两级分组包和模块让我感到困惑。
  2. 在我看来,没有广泛采用的代码命名约定
  3. 在我看来,有些标准库 API 文档不完整
  4. 有些标准库不是完全面向对象的,这让我很恼火

虽然有些python程序员告诉我他们没有这些问题,或者说这些都不是问题。

【讨论】:

  • 如果你还在做 python 编程,我推荐 Eclipse 和 PyDev。如果您喜欢更轻的东西,Intype (intype.info/home/index.php) 很好。 PEP 8 也是公认的样式指南,但当然这取决于个人程序员。 python.org/dev/peps/pep-0008
  • 缺少代码约定的哪一方面?我发现别人的 Python 代码通常可读性很强,因为“正确的方式”和“快速的方式”通常是最简单的方式,在语法上,所以人们使用类似的习语。
  • @Gregg Lind:一些标准库使用 this_naming_convention 和其他一些使用 thisNamingConvention 作为方法名称。即使在标准库中也没有采用的标准。
【解决方案4】:

Python 使用起来很有趣。我经常使用它,并且还在 C# 中编写了很多代码。用 Python 编写 UI 代码有两个缺点。一是没有一个单一的 ui 框架被大多数社区所接受。当你用 c# 编写时,.NET 运行时和类库都意味着一起工作。使用 Python,每个 UI 库都有自己的语义,这通常与您尝试编写程序的 Python 思维方式不一致。我不是在责怪图书馆作家。我尝试了几个库(wxwidgets、PythonWin[Wrapper around MFC]、Tkinter),这样做时我经常觉得我是在用 Python 以外的语言编写代码(尽管它是 python),因为这些库不是t 完全是 Pythonic,它们是来自另一种语言的端口,无论是 c、c++、tk。

所以对我而言,由于 IDE 和库的一致性,我将使用 .NET(对我而言是 C#)编写 UI 代码。但是当我可以的时候,我会用 python 编写业务逻辑,因为它更清晰,更有趣。

【讨论】:

    【解决方案5】:

    据我所知,他们在谷歌内部也使用了很多 python。

    我希望如此,如果我没记错的话,python 的制造商仍然在谷歌工作?

    至于 Python 的使用,我认为它对于独立应用程序来说是一种很棒的语言。它在许多 Linux 程序中大量使用,并且有一些不错的小部件可以帮助开发 GUI。

    【讨论】:

      【解决方案6】:

      没有什么可添加到其他答案的,此外如果你选择 python,你必须使用类似 pylint 的东西,到目前为止没有人提到。

      【讨论】:

      • 是的,但我认识的任何人开始在现有代码上使用 pylint 时,都会禁用大量检查。
      【解决方案7】:

      我们使用 IronPython 构建了我们的旗舰电子表格应用程序(40kloc 生产代码 - 它是 Python,IMO 意味着每个功能的 loc 低)Resolver Systems,所以我肯定会说它已经准备好用于复杂的生产使用应用程序。

      有两种方法可能对您没有用处:-)

      1. 我们使用的是 IronPython,而不是更常见的 CPython。这为我们提供了能够使用 .NET 类库的巨大优势。我可能在这里为自己准备好了,但我会说我从来没有真正见过看起来“专业”的 CPython 应用程序 - 所以能够访问 WinForms 小部件集对我们来说是一个巨大的胜利。 IronPython 还为我们提供了一个优势,即如果我们需要提高性能,可以轻松地使用 C#。 (虽然说实话,我们从来没有需要这样做。迄今为止,我们所有的性能问题都是因为我们选择了愚蠢的算法,而不是因为语言很慢。)从 IP 使用 C# 要容易得多而不是为 CPython 编写 C 扩展。
      2. 我们是一家极限编程商店,所以我们在编写代码之前先编写测试。如果不先编写测试,我不会用动态语言编写生产代码;缺少编译步骤需要被某些东西覆盖,正如其他人所指出的那样,没有它的重构可能会很困难。 (Greg Hewgill 的回答表明他遇到了同样的问题。另一方面,如果不先编写测试,我认为这些天我不会用 任何 语言编写 - 或者特别是重构 - 生产代码 - 但是YMMV。)

      Re:IDE - 我们对每个人都使用他们最喜欢的文本编辑器非常满意;如果您更喜欢重量级的东西,那么WingIDE 非常受欢迎。

      【讨论】:

      • IronPython 的一个明显问题当然是,如果你不在 Windows 上,你会在 .NET 上失败 :) 但是 Resolver 很酷,而且看起来确实像一个真正的应用程序 :)跨度>
      • 关于一个看起来很专业的 CPython -- 我假设你的意思是 native 在这种情况下 -- 你可以试试 wxPython。
      • 或 QT 的同一家公司的 PySide。
      • @GreggLind IronPython 在 MONO 下运行良好...不确定 09 年是否如此...只是为后代更新 :)
      • 这是一个很好的观点。一堆 Windows“.NET”组件仍然无法工作,尽管它们并不是真正的 .NET,而是原生 Windows 代码的 .NET 包装器。
      【解决方案8】:

      判断python用于什么的一种方法是查看目前使用python的产品。这个wikipedia page 有很长的列表,包括各种 Web 框架、内容管理系统、版本控制系统、桌面应用程序和 IDE。

      正如here 所说,“使用 Python 的一些最大项目是 Zope 应用服务器、YouTube 和最初的 BitTorrent 客户端。使用 Python 的大型组织包括 Google、Yahoo!、CERN 和 NASA。 ITA 的某些组件使用 Python。”

      简而言之,是的,它“适合用于开发独立复杂应用程序的生产用途”。许多其他语言也是如此,各有利弊。哪种语言最适合您的特定用例过于主观,无法回答,所以我不会尝试,但答案通常是“您的开发人员最了解的语言”。

      【讨论】:

        【解决方案9】:

        在较大的代码库中,重构是不可避免的,并且由于缺少静态类型,python 比静态类型语言更难做到这一点。

        【讨论】:

          【解决方案10】:

          我知道我说的可能是显而易见的,但不要忘记,开发团队的素质和他们对技术的熟悉程度将对您的交付能力产生重大影响。

          如果您拥有一支强大的团队,那么如果他们很熟悉,这可能不是问题。但是,如果您有更多不熟悉该技术的 9 到 5 岁的人,他们将需要更多支持,并且如果提高生产力值得付出任何支持的成本,您就需要打电话。

          【讨论】:

            【解决方案11】:

            Python 被认为(在 Python 程序员中 :) 是一种用于快速原型设计的出色语言。没有太多无关的语法妨碍您的思维过程,因此您所做的大部分工作都倾向于进入代码。 (与编写好的 C++ 相比,编写好的 Python 代码所需的习语要少得多。)

            鉴于此,大多数 Python (CPython) 程序员都认为“过早的优化是万恶之源”的哲学。通过编写高级(且速度明显较慢)的 Python 代码,可以在应用程序接近完成时使用 C/C++ 绑定优化瓶颈。此时,通过适当的分析,您的处理器密集型算法是什么变得更加清楚。通过这种方式,您可以以非常易读和可维护的方式编写大部分代码,同时允许在未来加速。出于这个原因,您将看到几个用 C 编写的 Python 库模块。

            无论如何,Python 中的大多数图形库(即 wxPython)只是 C++ 库的 Python 包装器,因此您几乎是在编写 C++ 后端。

            为了解决您的 IDE 问题,SPE(Stani 的 Python 编辑器)是我使用过的一个很好的 IDE,EclipsePyDev 也可以完成工作。两者都是 OSS,可以免费试用!

            [编辑] @Marcin:你有使用 Python 编写 > 30k LOC 的经验吗?您应该提到 Google 的可扩展性问题也很有趣,因为他们是 Python 的最大支持者!此外,一个名为 NASA 的小型组织也经常使用 Python;)请参阅 "One coder and 17,000 Lines of Code Later"

            【讨论】:

            • 这对一名编码员来说是件好事...对于有大量临时编码员和超过 17K 代码的项目呢?有人知道它在那里是否易于维护吗?
            【解决方案12】:

            你会找到两种答案——一个是宗教的(是的!当然!这是有史以来最好的语言!)另一个是宗教的(你一定是在开玩笑吧!Python?不......它还不成熟足够的)。我可能会跳过最后一个宗教(Python?!使用 Ruby!)。与往常一样,真相远非显而易见。

            优点:它简单易读,包括电池,有很多很好的库,几乎可以满足所有需求。它的表现力和动态类型使其在许多情况下更加简洁。

            缺点:作为一种动态语言,IDE 支持更差(正确的语法补全需要静态类型,无论是在 Java 中显式还是在 SML 中推断),它的对象系统远非完美(接口,有人吗?),很容易导致混乱的代码在未知情况下返回 int 或 boolean 或 object 或某种类型的方法。

            我的看法 - 我喜欢 Python 用于编写脚本、自动化、小型 Web 应用程序和其他定义明确的简单任务。在我看来,它是迄今为止最好的这个星球上的动态语言。也就是说,我永远不会使用它任何动态类型语言来开发大型应用程序。

            说 - 将它用于 Stack Overflow 会很好,它有三个开发人员,我猜代码不超过 30k 行。对于更大的事情——首先你的开发会非常快,然后一旦团队和代码库增长,事情就会比 Java 或 C# 慢得多。您需要通过编写更多单元测试来弥补编译时间检查的不足,重构变得更加困难,因为在您运行所有测试甚至整个大型应用程序之前,您永远不知道重构破坏了什么。

            现在 - 决定您的团队的规模以及应用完成后的规模。如果你有 5 个人或更少的人,并且目标大小大致是 Stack Overflow,那么继续,用 Python 编写。您将立即完成并对良好的代码库感到满意。但是如果你想写第二个谷歌或雅虎,你会用 C# 或 Java 更好。

            您提到的关于 C/C++ 的旁注:如果您不是在编写性能关键型软件(比如可以运行三个月渲染电影的大型并行光线追踪器)或非常关键的系统(比如可以飞行的火星着陆器)连续三年,只有一次机会着陆,否则你会损失 4 亿美元)不要使用它。对于 Web 应用程序、大多数桌面应用程序、大多数应用程序来说,这不是一个好的选择。你会死在复杂的业务逻辑中调试指针和内存分配。

            【讨论】:

            • 编译时间检查并不能替代测试。我不太理解python“需要大量单元测试”的抱怨,因为所有代码都应该......只是因为有些东西可以编译,并不意味着它会起作用!
            • 我很想知道接口的东西实际上影响了你编写的任何 pyton 代码。
            • 缺少接口?它的动态语言。此外,一个人应该足够聪明,尽可能避免 OOP。
            • “另外,一个人应该足够聪明,尽可能避免 OOP。”这根本没有意义。 OOP 编程肯定有它的位置,但您需要使您的架构与您要完成的任务保持一致。
            • 所有软件都需要单元测试,但是python中的软件比其他语言更需要。
            【解决方案13】:

            我真的很喜欢 python,现在它通常是我自己做的小型(非 gui)工作的首选语言。

            但是,对于我处理过的一些较大的 Python 项目,我发现它与使用 C++ 进行编程并不完全相同。我正在研究一个语言解析器,并且需要在 Python 中表示一个 AST。这当然在 Python 可以做的范围之内,但是我在重构时遇到了一些麻烦。我改变了我的 AST 的表示,并改变了很多方法和类,我发现我错过了 C++ 解决方案中可用的强类型。 Python 的鸭子类型几乎灵活,我发现自己添加了很多assert 代码来尝试在程序运行时检查我的类型。然后我不能确定所有内容都正确输入,除非我进行了 100% 的代码覆盖率测试(当时我没有)。

            实际上,这是我有时会想念的另一件事。可以在 Python 中编写语法正确的代码,而这些代码根本无法运行。编译器在实际执行代码之前无法告诉您它,因此在不常用的代码路径(例如错误处理程序)中,您很容易潜伏看不见的错误。即使是像打印带有 % 格式字符串的错误消息一样简单的代码也可能由于类型不匹配而在运行时失败。

            我没有将 Python 用于任何 GUI 的东西,所以我无法评论这方面。

            【讨论】:

            • 一般来说,如果你在 Python 中检查类型,那么你做错了。 Python 中的规范风格不是询问对象是什么类型,而是询问它支持什么方法。例如,不是问“你是狗吗?”,而是问“你能吠吗?”
            • @RyanGinstrom 据我了解,他对断言使用类型检查,而不是逻辑。这就像添加一些静态类型的味道以提高错误免疫。
            猜你喜欢
            • 2011-04-06
            • 2011-02-21
            • 1970-01-01
            • 2011-05-07
            • 2011-04-09
            • 1970-01-01
            • 2012-06-17
            • 2010-09-10
            • 1970-01-01
            相关资源
            最近更新 更多