python or not python
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的更多相关文章
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- 【Python大系】Python快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...
- python学习笔记-python程序运行
小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...
- python day1:初识Python(一)
一.Python 简介: Python免费.开源,面向对象的解释型语言,其语法简洁,在使用中无需考虑如何管理内存等底层问题,并且支持在linux,windows等多平台运行,Python的标准库很强大 ...
- 智普教育Python培训之Python开发视频教程网络爬虫实战项目
网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...
- 和我一起学python,初识python (life is short ,we need python)
作者:tobecrazy 出处:http://www.cnblogs.com/tobecrazy 欢迎转载,转载请注明出处.thank you! 由于项目需要(并非因为life is short), ...
- Python之路-python数据类型(列表、字典、字符串、元祖)操作
一.列表: 列表的语法,以中括号开通和结尾,元素以逗号隔开.例如:name = [] 列表是以下标取值,第一个元素下标是0,第二个元素下标是1,最后一个元素下标是-1. 1.增加 #name = ...
- 笨办法学 Python (Learn Python The Hard Way)
最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注 ...
- 【循序渐进学Python】12.Python 正则表达式简介
正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持. 1. 正则表达式的基本概念 1. 通配符 点号( . )可以匹配换 ...
- 【循序渐进学Python】5.Python常用流程控制及其他语句
1. 赋值语句常用技巧 通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中.解包的序列中的元素必须和等号左边变量数量一致.如下: values = ...
随机推荐
- lightning mdb 源代码分析(5)-事务控制
本博文系列前面已经探讨了LMDB的系统架构.MMAP映射.B-Tree操作等部分,本文将尝试描述LMDB中的事务控制的实现. 事务的基本特征: 事务是恢复和并发控制的基本单位.它是一个操作序列,这些操 ...
- spark Using MLLib in Scala/Java/Python
Using MLLib in ScalaFollowing code snippets can be executed in spark-shell. Binary ClassificationThe ...
- Apache开启不了------The requested operation has failed!
1.这个问题通常是由于端口被占用了,cmd输入netstat -ano查看端口号,根据端口号80的程序的pid在任务管理器下杀掉它. 2.我遇到这个问题不是这个原因.我由于刚配置了虚拟目录.查看虚拟目 ...
- [APAC]自动发送邮件
$lastMon = ((get-date).AddDays(-7) -split(" "))[0] $lastFri = ((get-date).AddDays(-3) -spl ...
- 插入随机数到MySQL数据库
我们经常会遇到使用随机的问题,下面就是一种解决随机数的方法. 在构造测试数据时,我们需要对测试表插入随机数据.构造测试数据的方法如下,仅以update为例说明 步骤1:随机数的SQL函数为rand() ...
- Jenkins学习记录
参考资料 官方文档 用MSBuild和Jenkins搭建持续集成环境(1) 用MSBuild和Jenkins搭建持续集成环境(2) 构建基于Jenkins + Github的持续集成环境 Jenkin ...
- PHP 单例模式代码片段
<?php error_reporting(E_ALL | E_STRICT); class single{ public $hash; static protected $ins = null ...
- UItableview section和cell的局部刷新
局部刷新//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tableview reloadS ...
- ThinkPHP的cookide保存二维数组的方法
ThinkPHP中的cookie是不支持二维数组的. 如果要保存二维数组.只能特殊处理 $data[263] = array('gid'=>263,'num'=>1); $data[266 ...
- 如何在Sublime text中运行PHP文件
如何在Sublime text中运行PHP文件 2014-06-14 17:17 3709人阅读 评论(1) 收藏 举报 phpSublime Text 一.将PHP安装目录放如环境变量PATH 二. ...