[原创]Python代码模块热更新机制实现(reload)
[原创]Python代码模块热更新机制实现(reload)
by AKara 2009-05-17 @ http://blog.csdn.net/akara @ akaras@163.com
---------------------------------------------------------------------
对一个游戏来说,无论是client或server都非常需要一套代码热更新的机制。
它能大大提高开发效率,又能超乎玩家期望地在运营期在线修正bug和增添功能。
可谓必备机制。
---------------------------------------------------------------------
在实现一个Python版本的热更新系统时,我走了不少弯路,钻了很多牛角尖,
完成了一个我看来有很多细节不够完善不够强大的版本,并在想做到'更完美'。
直到和同事DX,KHF讨论后,才发现最重要的是明确热更新机制的目标是什么。
往往我们善于将小事一件件做好,但却忘记问问自己为什么前行。
我要作的热更新机制的目标是:
(1)更新代码定义
(2)不更新数据对象
(3)不要依赖热更新机制解决所有问题。过于复杂的改动,重启进程
具体到Python这个语言而言,目标便是:
(1)更新类/函数及衍生对象:class/function/method/classmethod/staticmethod
(2)不更新除了(1)中的其他类型对象
(3)不要依赖热更新机制解决所有问题。过于复杂的改动,重启进程
第(3)点将我解救出来了:不要把所有责任压在热更新机制上。
本文所指模块只限于.py/.pyc/.pyo...(即非dll/so/bulitin)为载体的模块。
---------------------------------------------------------------------
Python的__builtins__中有一个众所周知的reload,但它在大项目中的可用性
几乎为零也是众所周知的。它辜负了Python Documentation中对它的评价:
"This is useful if you have edited the module source file using an
external editor and want to try out the new version without leaving
the Python interpreter"
---------------------------------------------------------------------
这里简单翻译一下Python内建的reload的说明:
当reload(M)被执行后:
* M模块将被重新解释字节码。并再执行模块级定义的执行语句(译注:由此应
认识到在模块级就编写函数调用和类对象生成是多么
相关文档:
正则表达式是个魔鬼,也是个天使。在你没有掌握它之前,它是魔鬼,在你掌握它后,它是天使,但是,时
不时还是要跳出来,给你调皮捣蛋一番。
一个正则表达式就是由普通字符以及特殊字符组成的文字模式,该模式描述在查找文字主体时待
匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的 ......
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。
有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:
原有编码 -> 内部编码 ->
目 ......
>>> import time
>>> import datetime
>>>
now = time.localtime()
>>> now
(2006, 4, 30, 18, 7, 35,
6, 120, 0)
>>> type(now)
<type 'time.struct_time'>
>>>
str_now = time.strftime("%m/%d/%Y %X", now )
>>>
str_n ......
import types
type(x) is types.IntType # 判断是否int 类型
type(x) is types.StringType #是否string类型
.........
--------------------------------------------------------
超级恶心的模式,不用记住types.StringType
import types
type(x) == types(1) # ......
http://www.okpython.com/bbs/thread-3367-1-2.html
以动手实践为荣 , 以只看不练为耻;
以打印日志为荣 , 以单步跟踪为耻;
以空格缩进为荣 , 以制表缩进为耻;
以单元测试为荣 , 以人工测试为耻;
以模块复用为荣 , 以复制粘贴为耻;
以多态应用为荣 , 以分支判断为耻;
以Pythonic为荣 , 以冗余拖沓为耻;
以总结分享为 ......