Tag Archives: python

利用Vim配置完美的Python开发环境

上上周末参加活动时一个同学分享的Vim让我重新燃起折腾Vim的兴趣,经过一周多的学习,实践,已经完全被Vim给征服了。最近刚好在学习Python,一直没有找到一个好的IDE,目前主要是用TextMate。经过这两天的努力,发现通过Vim的各种插件,可以配置出一个完美的Python开发环境,比TextMate还要强大得多。主要的插件配置如下(基本的Vim配置省略):snipMate + Pydiction.

其中snipMate 提供代码模板支持,和TextMate中的代码模板类似,通过Tab键补全;
Pydiction 提供Python关键字及标准库函数的补全,和Eclipse对Java的方法补全功能类似;

snipMate 安装:
如果你是Linux,可以直接通过cpan安装vimana,然后通过vimana安装snipMate,这样自己就不需要什么配置了。
同时vimana也支持其它插件的安装。如果没有的话,就需要手动安装,步骤如下:
1.从http://www.vim.org/scripts/script.php?script_id=2540下载snipMate.zip;
2.将文件解压到~/.vim目录下
3.修改~/.vimrc文件,增加set filetype plugin on
这样snipMate就安装完毕了,可以在~/.vim/snippets/目标下看到支持的语言

安装Pydiction步骤:
1.到http://www.vim.org/scripts/script.php?script_id=850下载Pydiction-1.2.zip文件;
2.解压后,按照说明将python_pydiction.vim放到~/.vim/after/ftplugin/目标下;
3.将complete-dict文件放到~/.vim/dict/目标下
4.修改~/.vimrc文件,增加下面两行:
filetype plugin on
let g:pydiction_location = ‘~/.vim/dict/complete-dict’

python_pydiction中还有一个pydiction.py的文件,这个是用来生成数据字典的,新加一个python库,生成一下,
具体教程可以看官方的说明。
这样配置完了之后,会发现snipMate与pydiction都是使用Tab键补全,会存在冲突。通过修改其中一个
的快捷键可以解决这个冲突。我选择修改pydiction的快捷键,修改方法如下:
打开python_pydiction.vim文件,找到这行
inoremap <silent> <buffer> <TAB>
修改为下面这样,就可以通过Ctrl+n来进行补全了。
inoremap <silent> <buffer> <C-n>

经过这样的配置,写起python程序就得心应手了。

Java,Groovy实现python中的Decorator

昨天去参加杭州一些朋友组织的圆桌技术交流,鱼哥 @nnfish分享了一个关于python的话题
,另外一位兄弟分享了一下Vim的一些使用心得,最后升哥分享了Redhat Linux安装过程背
背后所执行的逻辑。三个分享都给我不少的收获,经常参与这样的交流是学习的最佳途径。
鱼哥的分享中提到python中的一个Decorator的特性,这个特性和我最近在看的一篇文章中
提到的有异曲同工之秒。 如下是Java的实现:
public void wrapInTransaction(Command c) throws SQLException {
setupDataInfrastructure();
try {
c.execute();
completeTransaction();
} catch (RuntimeException ex) {
rollbackTransaction();
throw ex;
} finally {
cleanUp();
}
}
public void addOrderFrom(final ShoppingCart cart, final String userName,
final Order order) throws SQLException {
wrapInTransaction(new Command() {
public void execute() throws SQLException{
add(order, userKeyBasedOn(userName));
addLineItemsFrom(cart, order.getOrderKey());
}
});
}
再让我们看看groovy是如何做的:
public class OrderDbClosure {
def wrapInTransaction(command) {
setupDataInfrastructure()
try {
command()
completeTransaction()
} catch (RuntimeException ex) {
rollbackTransaction()
throw ex
} finally {
cleanUp()
}
}
def addOrderFrom(cart, userName, order) {
wrapInTransaction {
add order, userKeyBasedOn(userName)
addLineItemsFrom cart, order.getOrderKey()
}
}
}
最近我们再来看看python中通过Decorator实现的代码:
def transaction(func):
def _wrapper(*args,**kwargs):
setupDataInfrastructure()
func(*args,**kwargs)
completeTransaction()
return _wrapper
@transaction
def addOrderFrom(cart,userName,order):
add(order,userKeyBasedOn(userName))
addLineItemsFrom(cart,order.getOrderKey())

昨天参加了杭州一些朋友组织的圆桌技术交流。鱼哥 @nnfish分享了一个关于python的话题,另外一位兄弟分享了一下Vim的一些使用心得,最后升哥分享了Redhat Linux安装过程背后所执行的逻辑,明白了自己定制Linux时的基本原则。三个分享都有收获,经常参与这样的交流是学习的最佳途径。

鱼哥的分享中提到python中的一个Decorator的特性,这个特性和我最近在看的一篇文章《组合方法与SLAP》中讲述SLAP提到的设计有异曲同工之秒。 如下是Java的实现,使用了匿名内部类来包装要执行的逻辑:

public void wrapInTransaction(Command c) throws SQLException {

    setupDataInfrastructure();

    try {
        c.execute();
        completeTransaction();

    } catch (RuntimeException ex) {
        rollbackTransaction();
        throw ex;
    } finally {
        cleanUp();
    }
}

public void addOrderFrom(final ShoppingCart cart, final String userName,final Order order) throws SQLException {

    wrapInTransaction(new Command() {
        public void execute() throws SQLException{
            add(order, userKeyBasedOn(userName));
            addLineItemsFrom(cart, order.getOrderKey());
        }
    });

}

再让我们看看文中提到的使用groovy是如何做的:

public class OrderDbClosure {

    def wrapInTransaction(command) {
         setupDataInfrastructure()

         try {
             command()

             completeTransaction()
         } catch (RuntimeException ex) {
             rollbackTransaction()
             throw ex
         } finally {
             cleanUp()
         }
    }

    def addOrderFrom(cart, userName, order) {

        wrapInTransaction {
            add order, userKeyBasedOn(userName)
            addLineItemsFrom cart, order.getOrderKey()
        }

    }

}

Groovy的做法明显比Java简洁了,不过对业务代码的侵入性还是存在的。

最后再来看看python中通过Decorator 实现上述设计的代码(下面代码只为阐述Decorator):

def transaction(func):
    def _wrapper(*args,**kwargs):
        setupDataInfrastructure()
        func(*args,**kwargs)
        completeTransaction()
    return _wrapper

@transaction
def addOrderFrom(cart,userName,order):
    add(order,userKeyBasedOn(userName))
    addLineItemsFrom(cart,order.getOrderKey())

也可能通过如下方法调用:

transaction(addOrderFrom(cart,userName,order))

从上面三个例子可以看出语言层提供的特性深深影响着开发者的思唯方式,也这是为什么如何成为优秀的程序员的书中提倡开发者学会多种语言。目前正努力学习Python中,之前看这的Groovy又都快忘记了,要熟悉工作之外的编程语言并不容易。