avatar
Today is 星期天
2010年09月5日

搜索结果 分类目录: Python

2008年04月28日

Python的变长参数

由 晨笛 — 分类目录: Python评论暂缺

变长参数是样很神奇的东西。我写了下面一段代码:

[python]

class Person:
  def __init__(self, *pros, **attrs):
    self.name = “jeff”
    self.pros = pros
    for (key, value) in attrs.items():
      stm = “self.%s = \”%s\”"% (key, value)
      exec(stm)

if __name__ == “__main__”:
  jeff = Person(1, 2, 3, sex=”boy”)
  print jeff.pros
  print jeff.sex
  print dir(jeff)

[/python]

打印出来的内容是
(1, 2, 3)
boy
['__doc__', '__init__', '__module__', 'name', 'pros', 'sex']

简单解释一下:
参数以一个*号开头的代表着一个任意长度的数组,可以接收连续一串参数,如上面代码里传的是1,2,3,你可以更多。
参数以两个*号开头的代表着一个字典,参数的形式是“key=value”,接受连续任意多个参数。
在函数内,我们就可以把前者当作一个元组来处理,打印结果看得出来是一个元组。注意,调用方法是参数不定长,而在方法执行的时候,长度已定了,所以是元组。同时,我们可以把后者当作一个字典来处理。

示例代码里使用可变长参数实现了一个类属性的个性化定制,对于一个Person类,你可以通过传入字典类型的参数使这个类有更多原来不存在的属性,实现方法 是用了exec方法,目前只能通过字符串的参数。这里只是展示了可变参数的使用及exec的神奇力量。真正的函数不应该允许任意用户自定义属性的,可变参 数的目的是为定义函数方便及调用函数时,参数传入形式更自由而已。

2008年04月27日

用gettext实现i18n多语言界面

由 晨笛 — 分类目录: Python评论暂缺

想在开启程序界面的时候,中文系统就出现中文,英文系统就出现英文吗?呵呵,gettext就可以实现.

过去非常向往那种风格: 选了语言,就可以用什么语言显示.以前玩anjuta的时候总是有个gettext错误,弄得我每次新建工程的时候第一件事就是关掉gettext,而且搞的好像非常神秘似的,今天才知道就是这个gettext有这种能力.

其实说起来也没什么神秘的,gettext也就是建立一个语言对应文件,必要的时候去文件中查找某国语言,然后以那种形式读出,替代原来的字符罢了.

用Python玩个简单的例子吧!其实C++什么的都有相关程序,只不过C++写起来太麻烦了,而且C++的库在Windows上是一大堆,需要下载好些依赖的dll和exe,Python才两个py文件就可以.

Python的i18n工具的存放位置在Python24\Tools\i18n目录下,一共两个msgfmt.py和pygettext.py两个文件.

现在我们先来制作语言对应文件.

运行pygettext.py会生成一个messages.pot,注意,这不是个ppt模板,是一个po文件模板.拷贝一个,改名为gb.po,其实随便改成什么都好,只要扩展名为po(其实pot也可以),用记事本打开,里面的内容如下:
[code]
# SOME DEscrīptIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2006-11-04 11:47+中国标准时间\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
[/code]

把”Content-Type: text/plain; charset=CHARSET\n”改成
“Content-Type: text/plain; charset=gb2312\n”

把”Content-Transfer-Encoding: ENCODING\n”改成
“Content-Transfer-Encoding: cp936\n”
当然,这要看自己的情况了.gb2312是文件字符集,如果是utf8,则用utf8代替.
然后在文件后面添加msgid,msgstr对,比如添加完是这样:
[code]
# SOME DEscrīptIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2006-11-04 09:59+中国标准时间\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=gb2312\n"
"Content-Transfer-Encoding: cp936\n"
"Generated-By: pygettext.py 1.5\n"

msgid "Open"
msgstr "打开"

msgid "Edit"
msgstr "编辑"

msgid "delete"
msgstr "删除"

msgid "Export"
msgstr "导出"
[/code]

注意,第一个出现的msgid,msgstr对是文件头中的内容,不要动,否则会出问题.

好了,退出,运行dos命令:
msgfmt.py gb.po
生成一个gb.mo文件,这就是语言翻译库文件.
写个程序运行下:
[python]
import gettext
cat = gettext.GNUTranslations(open(“gb.mo”))
_ = cat.gettext
print _(“Open”)
print _(“Hello”)
[/python]

输出:
打开
Hello

可以看到,定义过的英文被翻译成了中文,其他的没有定义,也就还是英文输出.

© 2010 晨笛的博客 All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - 使用愉快!