python or not python

我挺喜欢 python 这种编程语言,它本身的丰富的动态特性让这种语言的表达能力很强,基本上 python 上写的一行代码,可实现 java 上 1.5 到 3 行左右的功能。它上手是挺容易的,照着帮助文档学,大概两天左右,有编程经验的人就能把语言的大部分特性学会。

但要注意的是,学会 python 并不意味着能用好 python ,特别是在大型多人协作的项目上。

有以下几点是必须要注意的:

缺乏的有效静态类型检查,需要精心设计单元测试

python 是一种动态语言,本身在静态类型检查等方面缺乏有效工具。采用 python 的项目,都要特别注重单元测试,防止引入了很低级的错误。我曾经遇到过把对象当成了函数,而且在单元测试都没有发现出来,因为这个对象本身被弄成了 callable 的,直到性能测试时,才在日志中发现了这个问题。

接口的概念较弱,设计时和工作分解时有难度

动态语言强大的动态类型有时给设计工作带来很大的麻烦,在设计时我们期望接口是明确目标的并有限制功能的,每一个参数应该是预定义的,而实现时很难限定传入的对象类型。同样的一个接口,不同的人很容易产生不同的理解,因此除非实现者已明确了函数的设计内容,以及它在整个解决方案中的作用,否则就会出现各种各样的实现。上面 callable 对象是其中一个例子,还有一个隐藏得比较深的例子:

某个接口函数 add_callback 需要一个回调函数,这个函数只有 async_result 作为参数,用于在异步调用结束时进行处理。但是为了处理一些额外的参数,于是出现了一个代码,大概如下:

...
for i in range(100):
def f(async_result):
dosomething(i)
dosomething(async_result)
a = A()
a.add_callback(f)
a.start()
...

还有人这样处理了:

def wrapper(i):
def f(async_result):
dosomething(i)
dosomething(async_result)
return f
...
for i in range(100):
a = A()
a.add_callback(wrapper(i))

本来,这应该是属于接口设计上的问题,但是却被通过不同的方法"巧妙"地掩盖了起来。

缺乏足够良好的可参考实践和标准

在实际的项目中,除了强制的缩进,不同的人很容易写出不同的代码风格!

在doc_strings上,python并没有规定注释的标准格式,因此有多种实际使用中的注释方法。

在大型项目方面,目前很少见到用python来编写,可能是目前还不是太多团队会采用 python 。但这点正在变化,像 OpenStack 这样的大项目基于 python 编写,很多工具也支持 python 接口。

由于动态语言的关系,python 在创建一个具有自己特色的框架方面会显得相对容易。因此,python的框架总是一大堆的,django / flask / web.py 之类的框架,每个都很有特色,选择起来容易头痛。

python or not python

这个问题,应该综合开发组实力,以及开发项目的规模、后期维护等因素综合考虑。

如果项目的规模不算大,而且成员都有一定的 python 编程经验,那么在限定编程规范时,还是值得使用 python 来进行快速迭代开发。如果项目大,接口多而复杂,就不建议采用 python 了,这种项目后期的维护工作量大,需要了解项目结构和设计的人才能继续维护 python ,还不如用 java 一些成熟的方案。

python 用得好,能很快建立系统原型,并在后续的开发中进行持续的迭代改进,比使用 java / C# 等要更快能实现一个可运行原型,而且代码量有显著的减少。python 的生态链越来越丰富,将来完善了各项支持工具,或者会有更多的项目采用 python,让它进行良性的发展循环。

python or not python的更多相关文章

  1. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  2. 【Python大系】Python快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...

  3. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  4. python day1:初识Python(一)

    一.Python 简介: Python免费.开源,面向对象的解释型语言,其语法简洁,在使用中无需考虑如何管理内存等底层问题,并且支持在linux,windows等多平台运行,Python的标准库很强大 ...

  5. 智普教育Python培训之Python开发视频教程网络爬虫实战项目

    网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...

  6. 和我一起学python,初识python (life is short ,we need python)

    作者:tobecrazy  出处:http://www.cnblogs.com/tobecrazy 欢迎转载,转载请注明出处.thank you! 由于项目需要(并非因为life is short), ...

  7. Python之路-python数据类型(列表、字典、字符串、元祖)操作

    一.列表: 列表的语法,以中括号开通和结尾,元素以逗号隔开.例如:name = [] 列表是以下标取值,第一个元素下标是0,第二个元素下标是1,最后一个元素下标是-1.   1.增加 #name = ...

  8. 笨办法学 Python (Learn Python The Hard Way)

    最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注 ...

  9. 【循序渐进学Python】12.Python 正则表达式简介

    正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持. 1. 正则表达式的基本概念 1. 通配符 点号( . )可以匹配换 ...

  10. 【循序渐进学Python】5.Python常用流程控制及其他语句

    1. 赋值语句常用技巧 通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中.解包的序列中的元素必须和等号左边变量数量一致.如下: values = ...

随机推荐

  1. Java 的class文件关系

    一个java源文件javac出多个class文件出来!是怎么回事? 1. 你在一个文件里定义了几个类的时候,会出现这种情况,比如public class A {}class B {}class C { ...

  2. [百科] - CreatePen()

    CreatePen编辑[声明]HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor);[说明]用指定的样式.宽度和颜色创建一个画笔[参数 ...

  3. DevOps 高效 shell 命令

    1.查看指定进程的top信息 大家都知道用top来查看系统实时指标,在 Linux 服务器上,如果想查看特定进程的top实时信息(以 node 进程为例),可以使用这样的命令: top -p `pgr ...

  4. Win7 桌面应用图标不见了

    taskkill /im explorer.exe /f cd /d %userprofile%\appdata\local del iconcache.db /a start explorer.ex ...

  5. ionic 写一个五星评价(非指令)

    Controller里的代码: .controller('evaluateCtrl', function($scope, $state, $stateParams, $ionicPopup,$ioni ...

  6. 被spring和hibernate4逼疯

    spring3.1整合hibernate4,事务都配置上了的,但getCurrentSession()仍然获得不到 以下是各配置 web.xml ? 1 2 3 4 5 6 7 8 9 10 11 1 ...

  7. mysq数据库再次理解

    1.表中的一条记录就是一个object,object有很多属性,对应表中的字段.object的属性对应的值就是字段值 2.外键是关联表关系用的.表关系的确立只能通过外键 但更高效的策略是,在数据库中部 ...

  8. PHP CURL 多线程 GET/POST 类

    PHP CURL 多线程 GET/POST 类 2015-01-01 分类:技术文章 阅读(623) 评论(0) 如果有需要更正或更高效的建议,欢迎在OSchina分享~\(≧▽≦)/~ http:/ ...

  9. Tomcat安装、启动和配置

    Tomcat服务器介绍 Tomcat是一个免费开发源代码的web应用服务器,具有与IIS.Apache等web服务器一样处理html页面的功能,另外它还是一个Servlet和JSP容器,独立的serv ...

  10. Java管道流

    管道流的主要作用可以用于两个线程之间的通信,有管道输出流 PipeOutputStream和管道输入流 PipeInputStream.然后通过connect将两个管道连接起来. import jav ...