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. 2015寒假ACM训练计划

    1月26号至3月4号 每天给自己一个计划.做有意义的事情,不要浪费时间. 8:00——11:30 acm训练 11:30——13:00 午休 13:00——17:30  acm训练 17:30——18 ...

  2. TCP和UDP的135、137、138、139、445端口的作用

    如果全是2000以上的系统,可以关闭137.138.139,只保留445 如果有xp系统,可能以上四个端口全部要打开 无论你的服务器中安装的是Windows 2000 Server,还是Windows ...

  3. [ZZ] The Naked Truth About Anisotropic Filtering

    http://www.extremetech.com/computing/51994-the-naked-truth-about-anisotropic-filtering In the seemin ...

  4. Ubuntu中搭建Nginx+PHP环境最简单的方法

    先安装: sudo apt-get install nginx php5-fpm 然后编辑配置文件: sudo gedit /etc/nginx/site-available/default 找到lo ...

  5. LR中日志设置和日志函数

    LR中日志参数的设置与使用 1.Run-Time Setting日志参数的设置 在loadrunner的vuser菜单下的Run-Time Setting的General的LOG选项中可以对在执行脚本 ...

  6. MP20 MBO issue summary

    MP3 MBO经验,教训 改名字HGA003_PTOT_01,发现居然闪现进度条,正常情况是不会闪现进度条的,只是改个名字而已,怀疑之前用过这个名字,所以我后来改成HGA003_PTOT_03了. 先 ...

  7. Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

    错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/S ...

  8. Delphi出现“borland license information was found,but it is not valid for delphi”的错误,无法运行的解决方法

    1) 删除文件: C:\documents and settings\<username>\.borland\registry.slm,如果在win8或在win7下,即C:\Users\H ...

  9. 纯C++文件调用MFC类

    在VS2008中 将预编译头属性 由 不使用预编译头 改成 使用使用预编译头 在响应的.cpp文件的最前面 #include "stdafx.h"

  10. 出现upstream sent too big header while reading response header from upstream错误

    一个POS系统,出现upstream sent too big header while reading response header from upstream错误. 1.反向代理端,可以放到se ...