如果你想在 python 项目中使用 stylus

Stylus 是用 node.js 写的,所以在 nodejs 项目中集成 Stylus 是一件很方便的事情,特别是 expressjs 这样的 web framework 直接配置下就可以用了。在 expressjs 中一旦你修改了 .styl 文件,立马就会被转换成同名的 .css 文件。

如果你想在 Python 项目中获得这样的特性,不妨来试试我写的一个 python package 吧: live-stylus

由于这个 package 依赖 python stylus ,python stylus 最终是要依赖 nodejs 和 stylus node package 的,所以你还是需要安装 nodejs 和 stylus node package 的。

如果你没有使用过 nodejs ,请在 nodejs 官网查看安装方法,然后:

npm install -g stylus

即可完成 stylus node package 的安装。然后:

pip install live-stylus

即可安装 live-stylus 。使用方法非常简单,比如在一个 Flask 项目中:

from flask import Flask
from live_stylus import ConvStylus

app = Flask(__name__)

from views import *

if __name__ == "__main__":
    app.debug = True
    ConvStylus()
    app.run()

这样就可以监控你项目中的所有 .styl 文件的变化,从而实时的转换成 .css 文件了。更多的说明和使用方式请参考此项目的github 主页

python中函数参数的默认值和List, dict

Python 的函数定义中,有种带有默认值的参数的语法,例如:

def foo( p = [] ): 
    print p

如果我们调用此函数的时候,没有传入参数 p ,那 p 就用默认值。

接下来,我们看看下面这段代码会得到什么结果:

def foo( p = [] ):
    p.append('a')
    print p

foo()
foo()

最开始,直觉告诉我,会得到结果:

['a']
['a']

但是实际结果是:

['a']
['a','a']

原来对于这种形式定义的带默认值的参数,参数的默认值是在函数定义的时候初始化的,当我们使用了 mutable 的对象的时候,我们中途改变了这个对象,在后面的函数调用中,它就不再是写在代码里的那个默认值。显然这样是很混乱的,我们不应该这样做。
python 官方文档也解释了这个事情,并且给出了解决方案,当我们需要一个 mutable 的对象作为默认值的时候,我们可以这样做:

def foo( p = None ):
    if p is None:
        p = []
    p.append('a')
    print p

这样每次都是生成一个新的,就没问题了。为了证实,带默认值的参数确实是在函数定义的时候初始化的,我们可以使用 id(p) 这个函数来查看这个变量的 identity , 可以看到,如果不传参数,让函数使用默认值,每次的 id 都是一样的。

WebSocket Protocol 介绍与实现

今天在方凳会上分享了 websocket protocol以及简单实现,PPT 和代码都放出来,有兴趣的可以围观

然后用 python 简单的实现了 websocket server,代码如下。在网上找的很多代码,都不再兼容 websocket draft 10, 因为 websocket 的草案进化太快,下面的代码是按照 draft10 写的。 chrome 14+ , firefox 7/8 都没有问题。

关于 websocket 草案,请阅读 http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10

 

另外推荐一个 Python 的 websocket server http://www.tavendo.de/autobahn/home.html, 基于 twisted 的异步模型。

使用google closure 压缩合并 js 文件的 python 脚本

google很早就推出了 google closure ,但是是JAVA的,你需要安装 JAVA的运行环境、配置等等。另外虽然google 也推出了WEB版的closure,但是用起来也是比较麻烦的,操作步骤比较多。如果你想使用 google closure,又懒得配置,又喜欢命令行的方便,现在有了另外的选择,google closure 提供了 API,这样我们就可以用其他的方式来压缩合并文件了。

我根据google 的python 事例,做了一些小修改,来方便压缩合并文件。这基本上算是我第一次写python,并放出来让人使用,python我只懂皮毛,大家看了代码不要笑话我。

项目地址:http://github.com/allenm/js-css-compressor 使用方式详见README

目前默认压缩级别是:SIMPLE_OPTIMIZATIONS 将来会有选项让用户选择压缩级别。

另外项目名称虽然是 js-css-compressor。但是目前没有 css 压缩的功能,因为 closure 不提供CSS的压缩,这个将来我会使用其他方式实现。

我把这个脚本放在VPS上来压缩合并我博客上的JS文件,准备一步步的优化这个博客的性能,拿这个作为试验田。

欢迎给我提意见和建议,联系方式在博客的About me 页面。